HashSet
优点:
后台实现一个hash table 加速get和contains方法。后台使用数组保存
缺点:
默认大小为16, 如果超过则需要重新申请内存空间,大小为原来的两倍,并把原来的数据内容复制到
新的内存空间中。
线程不安全(需通过Collections.synchronizedList方法设置)
加入的元素顺序会因其内部的hash排序而改变
注:通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
LinkedHashSet
优点:
后台实现一个hash table 加速get和contains方法。后台使用链表保存
缺点:
默认大小为16, 如果超过则需要重新申请内存空间,大小为原来的两倍,并把原来的数据内容复制到
新的内存空间中。
线程不安全(需通过Collections.synchronizedList方法设置)
加入的元素顺序会因其内部的hash排序而改变
注:通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
TreeSet
优点:
通过一个HashMap来实现数据的保存,内部实现红黑树数据结构,使所有元素按升序保存。
提供高效的get和contains方法,保存操作的效率为log(n)
缺点:
默认大小为16, 如果超过则需要重新申请内存空间,大小为原来的两倍,并把原来的数据内容复制到
新的内存空间中(来自HashMap)。
线程不安全(需通过Collections.synchronizedList方法设置)
加入的元素升级排序而改变
注:treeset对元素有要求,必须实现Comparable接口或是Comparator 接口)
注:通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
CopyOnWriteArraySet
优点:
针对于对Set操作的情况有很多变化时使用,优其是在高并发的情况不想使用同步控制锁时
缺点:
消耗比较大的资料,每次作更新操作时,都会重新Copy一块内存后,再做合并操作。