[知识整理]Java集合 - Set
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[知识整理]Java集合 - Set相关的知识,希望对你有一定的参考价值。
一、实现Set的几个类
HashSet、LinkedHashSet、TreeSet、ConcurrentSkipListSet、CopyOnWriterArraySet
二、对应底层的数据结构
HashSet - 哈希表
LinkedHashSet - 哈希表和链表
TreeSet - 红黑树
ConcurrentSkipListSet - 跳表
CopyOnWriteArraySet - 数组列表
三、应用场景
这里先从元素是否有序,按照什么顺序来应用进行Set的选择,最后再从线程安全的角度说一下Set的选择。
1、是否有序
HashSet:
如果对Set的集合插入没有顺序要求,那么推荐使用HashSet。HashSet实际上是使用HashMap的实例(key值为元素,value是一个没有意义的对象,后面篇章再详细说HashMap)。HashSet底层使用的是Hash散列,把元素散列存放在不同的地方(拉链法)。
如果需要有序,就要考虑LinkedHashSet和TreeSet了
2、按照什么顺序来保存Set的元素
LinkedHashSet在HashSet的基础上,使用一个双链表来记录插入的顺序。
TreeSet采用树结构来实现(红黑树算法),也就是TreeSet可以自定义Set中元素的排序规则。
3、是否线程安全
Set集合给出了ConcurrentSkipListSet和CopyOnWriteArraySet两个线程安全的类。
其中CopyOnWriteArraySet像前面文章说的那样,采用读写分离,保留"快照"的方式,因此遍历操作效率比较高且不会和其它线程冲突。
ConcurrentSkipListSet采用跳表的数据结构,它能够保证contains、add、remove的操作是原子性的,再多线程环境下是安全的,但不能保证addAll、removeAll、containsAll这些批量操作在多线程环境下安全。
以上是关于[知识整理]Java集合 - Set的主要内容,如果未能解决你的问题,请参考以下文章