Java集合系列之HashSet和LinkedHashSet【六】
HashSet是一个可存储不重复元素的容器,底层实现依赖 HashMap,所以在添加,删除,查找元素时的时间复杂度均为 O(1)。
1. HashSet
无序的单列不重复集合。类继承结构:
1.1 构造方法
都是初始化内部的map。
其它构造方法都没什么,说一下第二个构造方法,其中圈中的,经过计算可知:参数集合大小小于12时,HashMap的初始容量为16,大于12时以参数集合大小为准;也就是说HashMap的初始容量最小是16。
另外,addAll()是父类的方法:
只要有添加成功的就返回true。
1.2 基础方法
1.2.1 add
由于 HashSet只存储单个值,所以,内部以值为Key,以private static final Object PRESENT = new Object() 为 value存入HashMap中。
由HashMap的put方法可知:如果已经存在同样的key就返回旧的value,如果不存在同样的key,返回null。
所以,HashSet的add()方法:当没有元素时候,返回true,已存在,返回false。
测试代码:
执行结果:
1.2.2 remove方法
1.2.3 clear
1.2.4 isEmpty
1.2.5 contains
就是判断 HashMap 中 是否存在这个 Key,Key可以为NULL
1.2.6 iterator
2. LinkedHashSet
有序的不重复单列集合。LinkedHashSet 继承 HashSet,其实是使用 LinkedHashMap 实现的:
2.1 构造方法
说一下最后一个构造方法:
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 的时候不会使用这个构造函数。