Java集合系列之HashSet和LinkedHashSet【六】

HashSet是一个可存储不重复元素的容器,底层实现依赖 HashMap,所以在添加,删除,查找元素时的时间复杂度均为 O(1)。

1. HashSet

无序的单列不重复集合。类继承结构:
Java集合系列之HashSet和LinkedHashSet【六】

1.1 构造方法

Java集合系列之HashSet和LinkedHashSet【六】
都是初始化内部的map。
Java集合系列之HashSet和LinkedHashSet【六】
其它构造方法都没什么,说一下第二个构造方法,其中圈中的,经过计算可知:参数集合大小小于12时,HashMap的初始容量为16,大于12时以参数集合大小为准;也就是说HashMap的初始容量最小是16。

另外,addAll()是父类的方法:
Java集合系列之HashSet和LinkedHashSet【六】
只要有添加成功的就返回true。

1.2 基础方法

1.2.1 add

Java集合系列之HashSet和LinkedHashSet【六】
由于 HashSet只存储单个值,所以,内部以值为Key,以private static final Object PRESENT = new Object() 为 value存入HashMap中。

由HashMap的put方法可知:如果已经存在同样的key就返回旧的value,如果不存在同样的key,返回null。

所以,HashSet的add()方法:当没有元素时候,返回true,已存在,返回false。

测试代码:
Java集合系列之HashSet和LinkedHashSet【六】
执行结果:
Java集合系列之HashSet和LinkedHashSet【六】

1.2.2 remove方法

Java集合系列之HashSet和LinkedHashSet【六】

1.2.3 clear

Java集合系列之HashSet和LinkedHashSet【六】

1.2.4 isEmpty

Java集合系列之HashSet和LinkedHashSet【六】

1.2.5 contains

Java集合系列之HashSet和LinkedHashSet【六】
就是判断 HashMap 中 是否存在这个 Key,Key可以为NULL

1.2.6 iterator

Java集合系列之HashSet和LinkedHashSet【六】

2. LinkedHashSet

有序的不重复单列集合。LinkedHashSet 继承 HashSet,其实是使用 LinkedHashMap 实现的:
Java集合系列之HashSet和LinkedHashSet【六】

2.1 构造方法

Java集合系列之HashSet和LinkedHashSet【六】
Java集合系列之HashSet和LinkedHashSet【六】
说一下最后一个构造方法:
HashMap初始化容量最小为11。当参数集合大小小于等于5时,HashMap初始化容量大小为11;大于5时,为参数集合大小的2倍。初始容量为什么是Math.max(2*c.size(), 11),而和hashset中的Math.max((int) (c.size()/.75f) + 1, 16)不一致,网上查了很多也没查出来!!!!!!

另外图中圈中的dummy的参数解释:在这个构造方法中,dummy 的参数专门用来表示这个函数使用 LinkedHashMap,而不是 HashMap。一般我们自己使用 HashSet 的时候不会使用这个构造函数。