一、概述
This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This class permits the null element.
HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。
HashSet是基于HashMap来实现的,操作很简单,更像是对HashMap做了一次“封装”,而且只使用了HashMap的key来实现各种特性,我们先来感性的认识一下这个结构:
|
|
通过HashSet最简单的构造函数和几个成员变量来看一下,证明咱们上边说的,其底层是HashMap:
|
|
其实在英文注释中已经说的比较明确了。首先有一个HashMap的成员变量,我们在HashSet的构造函数中将其初始化,默认情况下采用的是initial capacity为16,load factor为0.75。
二、HashSet的实现
对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,只不过HashSet里面的HashMap所有的value都是同一个Object而已。HashSet的源代码如下:
|
|
对于HashSet中保存的对象,请注意正确重写其equals和hashCode方法,以保证放入的对象的唯一性。这两个方法是比较重要的,希望大家在以后的开发过程中需要注意一下。