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 的时候不会使用这个构造函数。

展开阅读全文
©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读