Set集合
1. 概述
Set集合主要有三个子类:
- HashSet
- 底层数据结构是哈希表+红黑树
- TreeSet
- 底层数据结构是红黑树
- 保证元素的排序方式
- LinkedHashSet
- 底层数据结构由哈希表和双向链表组成
2. HashSet解析
2.1 继承结构图
2.2 特征
- 实现Set接口
- 不保证迭代顺序
- 允许元素为null
- 底层实际上是一个HashMap实例
- 非同步
- 初始容量非常影响迭代性能
2.3 属性
//存储时用的map
private transient HashMap<E,Object> map;
//存储时用的虚拟value
private static final Object PRESENT = new Object();
2.4 方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
2.5 总结
HashSet实际上就是封装了HashMap,操作HashSet元素实际上就是操作HashMap,这也是面向对象的一种体现,重用性高。
3. TreeSet解析
3.1 继承结构图
3.2 特征
- 实现NavigableSet接口
- 可以实现排序功能
- 底层实际上是一个TreeMap实例
- 非同步
4. LinkedHashSet解析
4.1 继承结构图
4.2 特征
- 迭代有序
- 允许为null
- 底层实际上是一个HashMap+双向链表 (LinkedHashMap)
- 非同步
- 性能比HashSet差一些,因为要维护双向链表
- 初始容量和迭代无关 (参考LinkedHashMap)
5. 总结
- HashSet
- 无序,允许为null,底层是HashMap,非线程同步
- TreeSet
- 有序,不允许为null,底层是TreeMap,非线程同步
- LinkedHashSet
- 迭代有序,允许为null,底层是HashMap+双向链表,非线程同步