`

CoreJava: 第一次用LinkedHashSet带来的思考(二)

阅读更多


    在第一次用LinkedHashSet带来的思考(一) 中,顺着 LinkedHashSet的保序功能是怎么实现这一问题看了HashSet源码, 注意到HashSet的一个构造方法前没有写访问修饰符, 这样也就只有跟HashSet在同一个包的类才能访问这个构造方法了. 为了下面的谈论方便,我们将这种没写访问修饰符的情况称为"包修饰符",当然也有叫"默认修饰符"的,但个人觉得还是这个"包修饰符"较好些, 可以从名字上看出它的作用来.

    突然间觉得这种处理很巧妙: 原来在HashSet里边深藏着一个LinkedHashSet!真是藏在深闺无人知呀!在这个"包修饰符"修饰的构造方法的帮助下,  LinkedHashSet的实现就显得很干净简洁了.
    但不免会想, 有没有必要把LinkedHashSet的功能实现放到父类呢? 在自身类里不行吗? 若在自身类里, 别的类如想有同样的功能而简单地copy/paste也不想用"hasA"的组合方式的话, 就只能继承LinkedHashSet, 那样继承太深, 写在HashSet类里, 继承层次上会少些. 这样解释对不? 看来这OO设计中,在处理继承上有很多考虑的地方, 而平时做项目的工作中也很少体会到.


    上面是很干瘪地写了些关于HashSet里那个"包修饰符"构造方法的思考, 写的很难受, 根本原因是自己对这个的理解不对位,也就没能剥茧抽丝地把这个概念下的东西说清楚. 下面我试着描述下LinkedHashSet实现过程中所体现的"HasA"的组合方式.
    我们知道除copy/paste外, 正规军里的做法有继承和组合, 也就是"isA"和"hasA". 不过在设计实践中, 有这样的说法, 若只是为了代码重用的话, 尽量地用hasA的组合的方式. 一般而言, 在选择isA还是hasA时, 有如下参考:
        1, 不要仅仅为了代码重用而用isA的继承, 而用hasA的组合方式重用代码. 若用isA的继承, 当父类有什么改变时,子类就受到很大的牵连.
        2, 不要仅仅为了多态而用isA的继承,而用接口加组合方式.
    现在结合HashSet的实现, 看这两点的应用.HashSet内部用一个HashMap来作为数据的最终存放地,  它并没有继承HashMap类. 从另一方面来说, 为了实现多态, HashSet实现了Set接口.

    见的很糟, 比自己的预期差不少. .....

分享到:
评论

相关推荐

    java集合-LinkedHashSet的使用

    LinkedHashSet 是 Java 中的一个集合类,它是 HashSet 的子类,同时也实现了 Set 接口。与 HashSet 不同的是,LinkedHashSet 保留了元素插入的顺序,并且具有 HashSet 的快速查找特性。下面是关于 LinkedHashSet 的...

    Core Java Volume I

    4. **数组和集合框架**:详述了一维和多维数组的使用,并介绍了Java集合框架,包括List(ArrayList、LinkedList)、Set(HashSet、LinkedHashSet)、Map(HashMap、TreeMap)的使用和操作。 5. **字符串处理**:...

    core java

    《核心Java》是Java编程领域中的经典教材,涵盖了Java语言的基础到高级特性,分为Volume I(基础篇)和Volume II(进阶篇)。这个压缩包包含的文件可能是这两个部分的源代码示例,有助于读者深入理解Java编程的核心...

    Core.Java练习题与编程规范

    Core Java涵盖了语言基础、集合框架、IO流、多线程、网络编程等多个核心领域,是成为一名合格Java开发者的基石。本文将围绕Core Java的练习题与编程规范展开讨论,帮助初学者更好地理解和运用Java语言。 1. **Java...

    core Java volume I英文版

    作为Core Java系列的第一卷,它主要关注Java的核心概念和技术,为读者构建坚实的编程基础。 在本书中,你可以学到以下关键知识点: 1. **Java语言基础**:了解Java的历史背景、安装Java开发环境(JDK)以及编写第...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入...

    尚硅谷-深入Java集合5:LinkedHashSet的实现原理.pdf

    ·课程共30天,715个知识视频小节,涉及主流Java使用的方方面面,全而不冗余 ·全程内容涵盖数据结构、设计模式、JVM内存结构等深度技术 ·企业级笔试面试题目深入源码级讲解,拒绝死记硬背 4.代码量更大、案例更...

    计算机后端-Java-Java核心基础-第24章 集合01 24. LinkedHashSet的使用.avi

    计算机后端-Java-Java核心基础-第24章 集合01 24. LinkedHashSet的使用.avi

    java技术手册:第六版 高清带目录可以复制粘贴

    《Java技术手册:第六版》是一本针对Java编程语言的权威指南,由安道出版社精心翻译,具有高清的页面质量,方便读者清晰查看,并且具备可复制粘贴的功能,极大地便利了学习和代码实践。本手册涵盖了Java语言的各个...

    HashSet、LInkedHashSet的使用和特点

    HashSet、LInkedHashSet的使用和特点

    Java 最常见的 208 道面试题:第二模块答案

    【Java 容器详解】 Java 容器是 Java 核心库的重要组成部分,它们提供了存储和管理对象的方式。常见的容器包括以下几类: 1. **集合接口**:主要有 Collection 和 Map 两大接口。 - **Collection**:代表一组不...

    HashSet,TreeSet和LinkedHashSet的区别1

    在Comparator的compare()方法中,返回0表示两个对象相等,正数表示第一个对象大于第二个,负数则表示第一个对象小于第二个。TreeSet同样不保证元素的特定顺序,除非通过Comparator指定。 总结来说,HashSet适用于不...

    Java 72 道面试题及答案.docx

    Java 集合框架是一种用于存储和管理对象的容器,主要有三种类型:Set(集)、List(列表)和 Map(映射)。集合的特点主要有两点:一是集合用于存储对象的容器,对象是用来封装数据的,对象多了也需要存储集中式管理...

    细说Java之util类.

    Java中的`util`类是Java开发中不可或缺的一部分,它们提供了许多数据结构和工具类的实现,使得开发者可以方便地处理各种数据。`java.util`包是Java标准库的核心部分,包含了许多用于处理集合、时间日期、随机数生成...

    ritelinked:LinkedHashMap和LinkedHashSet

    提供了LinkedHashMap和LinkedHashSet更多最新版本。 您可以在std或no_std环境中轻松使用它。 一些实用的功能组合,支持,帮助您更好地将其嵌入到现有代码: serde , inline-more等。特别是,它使用griddle在默认...

    Java应用:两种Java容器类List和Set分析

    #### 二、Java容器类List详解 **1. List接口简介** - `List`接口是`Collection`接口的一个子接口,主要特点是有序且允许重复元素。 - `List`中的元素按照插入顺序排序,可以保持元素的插入顺序,并支持通过索引...

    Java:Java学习相关代码

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和强大的库支持而闻名。"Java:Java学习相关代码"的标题和描述暗示了这个压缩包可能包含了一系列用于学习Java编程的示例代码或者项目。文件名为"Java-...

    java collection framework

    此外,还介绍了一种名为 JGL (Java Generic Library) 的第三方库,该库在 Java Collection Framework 出现之前就已经存在,并且提供了一些额外的功能。 #### 八、总结 《Java Collection Framework》这本书不仅是...

Global site tag (gtag.js) - Google Analytics