HashSet: 底层依靠 HashMap 来存储数据,例如 set.add("Hello World.")。
允许存入 null 值;
不允许重复,同一个对象最多存在一次;
不保证其插入的顺序,其顺序可能随时间而发生变化。
优势/劣势
HashSet 底层使用HashTable来保证元素的不重复性,实际上使用的是HashMap的一个实例。
- 优势:基于散列表,去重效率较高,支持 null 值;
- 劣势:不支持排序,可使用 TreeSet 代替;
主要成员变量
private transient HashMap<E,Object> map; // 用于存储元素的 HashMap
private static final Object PRESENT = new Object(); // 作为 HashMap 的 value 值
直接源码开撸
因为 HashSet 底层使用 HashMap 来存储相应的元素,熟悉了 HashMap 之后,就能无压力掌握 HashSet;详见如下:
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*/
public HashSet() {
map = new HashMap<>();
}
// 添加一个元素
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
可见其实现非常简洁,如果对HashMap不太熟悉的同学可以参考这篇文章。
线程安全的Set
- 官方建议方式:Set s = Collections.synchronizedSet(new HashSet(...))