Set接口的实现类

HashSet与LinkedHashSet

HashSet与LinkedHashSet的关系就如同HashMap和LinkedHashMap一样。HashSet内部保存了一个HashMap对象来存储。

set-1

利用Map对象,存入Map的k-v中value对象始终是同一个对象(就是上图中声明的private static final Object PRESENT = new Object()对象)。从而Set只需要关心key对象即可。

set-2

  1. 很显然,Set存储的key集合是无序的。默认大小就是hashmap的默认大小16。每一次扩容也是2的倍数递增。
  2. 上面的第2张图示HashSet的构造方法之一,可以看到是生成了一个LinkedHashMap,下面的LinkedHashSet就是调用这个构造方法来生成的。

set-3

LinkedHashSet则是继承自HashSet,并且在生成的时候,调用了父类HashSet的对应的方法,从而维护了一个LinkedHashMap对象,就实现了元素有序。

  1. 上图可以看到,LinkedHashSet构造方法都是调用了父类中含有dummy参数的那一个构造方法(也就是维护LinkedHashMap的那一个!)

TreeSet

显然,TreeSet内部也是维护了TreeMap来存储元素。只保存key,而value值都是同一个Object对象。

set-4

  1. Set对于的并发类有:java.util.concurrent.CopyOnWriteArraySet类和Collections.synchronizedSet(Set set)所修饰的类。
  2. 这2个并发类的区别和List对应的并发类的区别是一致的。前者是写时复制,只保证数据最终的一致性,而不保证数据实时的一致性。后者借助synchronized关键字修饰代码块,尽量减小了锁的粒度。

Set类图

set-5


柒叶
409 声望43 粉丝