从Java源代码的角度来说,HashSet
是基于HashMap
来实现的。其实细看下你会发现,除了EnumSet
,其他几乎所有的XXXSet都是基于XXXMap来实现1。如:
- HashSet(HashMap)
- TreeSet(TreeMap)
- LinkedHashSet(LinkedHashMap)
- CopyOnWriteArraySet(CopyOnWriteArrayMap)
- ConcurrentSkipListSet(ConcurrentSkipListMap)
- JobStateReasons(HashMap)
但是有没有发现,好像并没有存在ConcurrentHashMap
对应的ConcurrentHashSet
。
那我们自己该如何来实现呢?
CopyOnWriteArraySet
使用:
CopyOnWriteArraySet<E> sets = new CopyOnWriteArraySet<E>();
注意事项:最好适用于size比较小,并且绝大部分都是读操作。因为此种Set在写操作的时候很费时费力,需要完全拷贝原来的值。
ConcurrentSkipListSet
构造函数:
ConcurrentSkipListSet()
ConcurrentSkipListSet(Collection<? extends E> c)
ConcurrentSkipListSet(Comparator<? super E> comparator)
ConcurrentSkipListSet(SortedSet<E> s)
Collections.synchronizedSet(Set<T> s)
注意事项:生成的Set都是全局锁。相比于ConcurrentHashMap
的分段锁来说效率比较低。
Collections.newSetFromMap(Map<E,Boolean> map)
ConcurrentHashMap.newKeySey()
完全基于ConcurrentHashMap
来实现的Concurrent Set。
- Guava15
Sets.newConcurrentHashSet()
参考资料