Set接口的实现类
HashSet与LinkedHashSet
HashSet与LinkedHashSet的关系就如同HashMap和LinkedHashMap一样。HashSet内部保存了一个HashMap对象来存储。
利用Map对象,存入Map的k-v中value对象始终是同一个对象(就是上图中声明的private static final Object PRESENT = new Object()
对象)。从而Set只需要关心key对象即可。
- 很显然,Set存储的key集合是无序的。默认大小就是hashmap的默认大小16。每一次扩容也是2的倍数递增。
- 上面的第2张图示HashSet的构造方法之一,可以看到是生成了一个LinkedHashMap,下面的LinkedHashSet就是调用这个构造方法来生成的。
LinkedHashSet则是继承自HashSet,并且在生成的时候,调用了父类HashSet的对应的方法,从而维护了一个LinkedHashMap对象,就实现了元素有序。
- 上图可以看到,LinkedHashSet构造方法都是调用了父类中含有dummy参数的那一个构造方法(也就是维护LinkedHashMap的那一个!)
TreeSet
显然,TreeSet内部也是维护了TreeMap来存储元素。只保存key,而value值都是同一个Object对象。
- Set对于的并发类有:java.util.concurrent.CopyOnWriteArraySet类和Collections.synchronizedSet(Set set)所修饰的类。
- 这2个并发类的区别和List对应的并发类的区别是一致的。前者是写时复制,只保证数据最终的一致性,而不保证数据实时的一致性。后者借助synchronized关键字修饰代码块,尽量减小了锁的粒度。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。