在第一次用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接口.
见的很糟, 比自己的预期差不少. .....
分享到:
相关推荐
LinkedHashSet 是 Java 中的一个集合类,它是 HashSet 的子类,同时也实现了 Set 接口。与 HashSet 不同的是,LinkedHashSet 保留了元素插入的顺序,并且具有 HashSet 的快速查找特性。下面是关于 LinkedHashSet 的...
4. **数组和集合框架**:详述了一维和多维数组的使用,并介绍了Java集合框架,包括List(ArrayList、LinkedList)、Set(HashSet、LinkedHashSet)、Map(HashMap、TreeMap)的使用和操作。 5. **字符串处理**:...
《核心Java》是Java编程领域中的经典教材,涵盖了Java语言的基础到高级特性,分为Volume I(基础篇)和Volume II(进阶篇)。这个压缩包包含的文件可能是这两个部分的源代码示例,有助于读者深入理解Java编程的核心...
Core Java涵盖了语言基础、集合框架、IO流、多线程、网络编程等多个核心领域,是成为一名合格Java开发者的基石。本文将围绕Core Java的练习题与编程规范展开讨论,帮助初学者更好地理解和运用Java语言。 1. **Java...
作为Core Java系列的第一卷,它主要关注Java的核心概念和技术,为读者构建坚实的编程基础。 在本书中,你可以学到以下关键知识点: 1. **Java语言基础**:了解Java的历史背景、安装Java开发环境(JDK)以及编写第...
Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入...
·课程共30天,715个知识视频小节,涉及主流Java使用的方方面面,全而不冗余 ·全程内容涵盖数据结构、设计模式、JVM内存结构等深度技术 ·企业级笔试面试题目深入源码级讲解,拒绝死记硬背 4.代码量更大、案例更...
计算机后端-Java-Java核心基础-第24章 集合01 24. LinkedHashSet的使用.avi
《Java技术手册:第六版》是一本针对Java编程语言的权威指南,由安道出版社精心翻译,具有高清的页面质量,方便读者清晰查看,并且具备可复制粘贴的功能,极大地便利了学习和代码实践。本手册涵盖了Java语言的各个...
HashSet、LInkedHashSet的使用和特点
【Java 容器详解】 Java 容器是 Java 核心库的重要组成部分,它们提供了存储和管理对象的方式。常见的容器包括以下几类: 1. **集合接口**:主要有 Collection 和 Map 两大接口。 - **Collection**:代表一组不...
在Comparator的compare()方法中,返回0表示两个对象相等,正数表示第一个对象大于第二个,负数则表示第一个对象小于第二个。TreeSet同样不保证元素的特定顺序,除非通过Comparator指定。 总结来说,HashSet适用于不...
Java 集合框架是一种用于存储和管理对象的容器,主要有三种类型:Set(集)、List(列表)和 Map(映射)。集合的特点主要有两点:一是集合用于存储对象的容器,对象是用来封装数据的,对象多了也需要存储集中式管理...
Java中的`util`类是Java开发中不可或缺的一部分,它们提供了许多数据结构和工具类的实现,使得开发者可以方便地处理各种数据。`java.util`包是Java标准库的核心部分,包含了许多用于处理集合、时间日期、随机数生成...
提供了LinkedHashMap和LinkedHashSet更多最新版本。 您可以在std或no_std环境中轻松使用它。 一些实用的功能组合,支持,帮助您更好地将其嵌入到现有代码: serde , inline-more等。特别是,它使用griddle在默认...
#### 二、Java容器类List详解 **1. List接口简介** - `List`接口是`Collection`接口的一个子接口,主要特点是有序且允许重复元素。 - `List`中的元素按照插入顺序排序,可以保持元素的插入顺序,并支持通过索引...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和强大的库支持而闻名。"Java:Java学习相关代码"的标题和描述暗示了这个压缩包可能包含了一系列用于学习Java编程的示例代码或者项目。文件名为"Java-...
此外,还介绍了一种名为 JGL (Java Generic Library) 的第三方库,该库在 Java Collection Framework 出现之前就已经存在,并且提供了一些额外的功能。 #### 八、总结 《Java Collection Framework》这本书不仅是...