本文共 3200 字,大约阅读时间需要 10 分钟。
Set 是 Java 中的一种集合,它的特点是允许存储唯一的元素,不允许重复存储,并且通常不关心元素的顺序。Set 的主要实现类包括 HashSet、TreeSet 和 LinkedHashSet。这些集合的内部实现都依赖于 HashMap、TreeMap 和 LinkedHashMap 的存储结构。
HashSet 和 LinkedHashSet 的实现分别依赖于 HashMap 和 LinkedHashMap 的存储结构,而 TreeSet 则依赖于 TreeMap。从继承关系来看,HashSet 和 LinkedHashSet 继承自 AbstractSet,TreeSet 继承自 AbstractSet 和 NavigableSet。
HashSet 的实现非常简单,其内部实际上使用了 HashMap 来存储元素。HashSet 的构造方法调用了 HashMap 的相应构造方法来初始化存储结构。以下是 HashSet 的关键构造方法和实现:
构造方法:
HashSet():初始化一个默认容量和默认加载因子的 HashSet,内部调用 HashMap 的空构造方法。HashSet(int initialCapacity):初始化一个指定容量的 HashSet,内部调用 HashMap 的指定容量构造方法。HashSet(int initialCapacity, float loadFactor):初始化一个指定容量和加载因子的 HashSet,内部调用 HashMap 的相应构造方法。HashSet(Collection c):初始化一个容量根据集合 c 的大小确定的 HashSet,内部调用 HashMap 的相应构造方法,并将集合 c 中的元素全部添加到 HashSet 中。存储结构:HashSet 的底层存储结构由 HashMap 实现,通过 map.put(e, PRESENT) 来存储元素。PRESENT 是一个静态的 Object 对象,用于表示元素的值。
方法实现:HashSet 实现了 Set 接口中的所有方法,包括 add、remove、contains、isEmpty、size 等方法。这些方法通过调用 HashMap 的相应方法来实现。
迭代器:HashSet 的迭代器由 HashMap 的 KeyIterator 实现,通过调用 next() 方法可以得到当前元素。
LinkedHashSet 的实现类似于 HashSet,但它的底层存储结构依赖于 LinkedHashMap。LinkedHashSet 维护了一个双向链表来记录元素的插入顺序。以下是 LinkedHashSet 的关键构造方法和实现:
构造方法:
LinkedHashSet():初始化一个默认容量和默认加载因子的 LinkedHashSet,内部调用 HashMap 的空构造方法。LinkedHashSet(int initialCapacity):初始化一个指定容量的 LinkedHashSet,内部调用 LinkedHashMap 的相应构造方法。LinkedHashSet(int initialCapacity, float loadFactor):初始化一个指定容量和加载因子的 LinkedHashSet,内部调用 LinkedHashMap 的相应构造方法。LinkedHashSet(Collection c):初始化一个容量根据集合 c 的大小确定的 LinkedHashSet,内部调用 LinkedHashMap 的相应构造方法,并将集合 c 中的元素全部添加到 LinkedHashSet 中。存储结构:LinkedHashSet 的底层存储结构由 LinkedHashMap 实现,通过 map.put(e, PRESENT) 来存储元素。
方法实现:LinkedHashSet 实现了 Set 接口中的所有方法,包括 add、remove、contains、isEmpty、size 等方法。这些方法通过调用 LinkedHashMap 的相应方法来实现。
迭代器:LinkedHashSet 的迭代器由 LinkedHashMap 的 EntryIterator 实现,通过调用 next() 方法可以得到当前元素及其对应的值。
ArrayList 与 LinkedList 的区别:
ArrayList 与 Vector 的区别:
HashMap 的工作原理及 JDK 1.8 的优化:
HashMap 与 Hashtable 的区别:
HashMap 与 LinkedHashMap 的区别:
HashSet 如何检查重复:
快速失败规则:
集合的迭代与删除:
本文分析了 HashSet 和 LinkedHashSet 的源码实现,揭示了 Set 与 Map 之间的关系,并总结了集合面试中的常见问题。这些知识点在面试中非常重要,理解了集合的实现原理和各个集合之间的区别,可以帮助开发高效率的代码。
转载地址:http://enzq.baihongyu.com/