HashSet: 基于散列表的Set集合

HashSet: 底层依靠 HashMap 来存储数据,例如 set.add("Hello World.")。

  • 允许存入 null 值;

  • 不允许重复,同一个对象最多存在一次;

  • 不保证其插入的顺序,其顺序可能随时间而发生变化。

优势/劣势

HashSet 底层使用HashTable来保证元素的不重复性,实际上使用的是HashMap的一个实例。

  • 优势:基于散列表,去重效率较高,支持 null 值;
  • 劣势:不支持排序,可使用 TreeSet 代替;

主要成员变量

private transient HashMap map; // 用于存储元素的 HashMap
private static final Object PRESENT = new Object(); // 作为 HashMap 的 value 值

直接源码开撸

因为 HashSet 底层使用 HashMap 来存储相应的元素,熟悉了 HashMap 之后,就能无压力掌握 HashSet;详见如下:

/**
 * Constructs a new, empty set; the backing HashMap 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(...))

你可能感兴趣的:(HashSet: 基于散列表的Set集合)