HashSet源码解析!

HashSet

HashSet原理:使用的就是组合 HashMap。

  • 把 HashMap 当作自己的一个局部变量。
1
2
3
4
// 把 HashMap 组合进来,key 是 Hashset 的 key,value 是下面的 PRESENT
private transient HashMap<E,Object> map;
// HashMap 中的 value
private static final Object PRESENT = new Object();

1、在使用 HashSet 时,比如 add 方法,只有一个入参,但组合的 Map 的 add 方法却有 key,value 两个入参。

相对应上 Map 的 key 就是我们 add 的入参,value 就是第二行代码中的 PRESENT。

  • 用一个默认值 PRESENT 来代替 Map 的 Value。

2、如果 HashSet 是被共享的,当多个线程访问的时候,就会有线程安全问题,因为在后续的所有操作中,并没有加锁。

TreeSet

TreeSet底层组合的是 TreeMap,所以继承了 TreeMap key 能够排序的功能,迭代的时候,也可以按照 key 的排序顺序进行迭代。