hashset实现原理
HashSet
底层是HashMap
,可以看源码很容易就看到了.
HashSet.add
其实就是把值本身作为key
put
进HashMap
,然后HashMap
的value
固定是同一个Object
,这个Object
是用static
final
声明的,是属于这个Class
的
TreeSet实现原理
TreeSet
是一个有序的集合,它的作用是提供有序的Set集合
。它继承于AbstractSet
抽象类,实现了NavigableSet<E>, Cloneable, java.io.Serializable
接口。
它的底层是使用的TreeMap
来实现的,其add
方法也是将value
作为key
put
进TreeMap
中去,value
还是一个static final 的Object
;
TreeSet是非线程安全的。因为TreeMap就是非线程安全的.
遍历TreeSet可以使用迭代器正序/逆序遍历,但是直接使用for-each遍历需要转成数组才行.并且它的迭代器都是快速失败的.
什么是快速失败呢?
fail-fast机制在遍历一个集合时,当集合结构被修改,会抛出Concurrent Modification Exception。
fail-fast会在以下两种情况下抛出ConcurrentModificationException
-
(1)单线程环境
集合被创建后,在遍历它的过程中修改了结构。
-
(2)多线程环境
当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改。