1 概念与结构
Set集合结构图
Set集合概念:
-
Set是不包含重复元素 的集合。Set集合也是继承了Collection,所以Collection中的操作广场对Set集合同样适用。
-
HashSet和TreeSet是Set的实现
-
HashSet是基于Hash算法实现的,其性能通常优于TreeSet,我们通常都应使用HashSet,在我们需要排序的功能时,我们才使用TreeSet
2 HashSet
- 此类实现 Set 接口,底层由哈希表(实际为 HashMap 实例)实现。 对集合的迭代次序不作任何保证;
- 特别是,它不能保证迭代在一段时间内保持不变。
- 这个类允许 null 元素。
查看HashSet的本质
- 可以看到,内部由HashMap实现,key可以传入,value为final定义的常量作为占位符。
- HashSet的数据实际上就是HashMap的key的集合
// 使用HashMap存储数据,HashSet的数据实际为HashMap的key
private transient HashMap<E,Object> map;
// HashMap value占位符
private static final Object PRESENT = new Object();
HashMap的key是不允许重复的,这也正好符合Set的特性。因此HashSet内部采用HashMap存储数据,所以HashSet可以存储null值,支持快速失败,非线程安全。
构造函数
可以看到,创建HashSet的本质就是初始化HashMap。
// 空参构造函数,内部初始化map属性
public HashSet() {
map = new