Java之Collection集合特性简介说明
下文笔者讲述Collection中常见集合及其特性简介说明,如下所示
Collection中常见集合
list: ArrayList LinkedList Vector Stack CopyOnWriteArrayList Set HashSet TreeSet CopyOnWriteArraySet Map HashMap LinkedHashMap TreeMap Hashtable ConcurrentHashMap
每一个集合的特性说明
ArrayList
ArrayList:非线程安全
ArrayList数据存储原理:
底层采用数组进行存储(使用Object[]数组来存储元素)
ArrayList特性:
查询效率高
增加效率低
如果不考虑查询效率或元素个数少的时候可以使用ArrayList;
LinkedList
LinkedList:非线程安全
LinkedList数据存储原理:双向链表
LinkedList特性:
查询效率低
增加效率高
当出现大量添加而不需要大量的查询的时候可以考虑使用LinkedList
可通过get(index)方法获取元素
LinkedList,有first与last成员变量
代表第一个元素和最后一个元素
当通过get进行查询时
先会比较在前半段还是后半段
当在前半段
将通过first节点依次向后进行遍历
当在后边半段,将通过last节点依次向前遍历(双向链表)
Vector
Vector:线程安全(synchronize方法锁)
Vector数据存储原理:
同ArrayList原理相同,在此基础上加上了synchronzed的方法锁
Vector特性:
synchronzed的方法锁导致Vector的锁粒度太大
在并发场景下,效率很低所以基本没有使用情况
Stack
Stack:线程安全(synchronize方法锁)
Stack是在Vector的基础上封装了push与pop方法
Stack特性:同Vector相同
CopyOnWriteArrayList
CopyOnWriteArrayList:线程安全(使用ReentrantLock可重入锁)
CopyOnWriteArrayList数据存储原理:
写时复制技术
在添加的时候会创建一个原来的副本,以供读操作
Set
HashSet
HashSet:非线程安全
HashSet存储原理:
底层还是HashMap,维护一个HashMap<T, Object> map;
HashSet特性:无重复元素,查询与添加的效率较高;
TreeSet
TreeSet:非线程安全
TreeSet数据存储原理:
红黑树——通过构造函数可以知道TreeSet其实就是在维护TreeMap
CopyOnWriteArraySet
CopyOnWriteArraySet:线程安全(使用ReentrantLock可重入锁保证线程安全)
CopyOnWriteArraySet数据存储原理:
写时复制技术,在添加的时候会创建一个原来的副本,以供读操作
Map
HashMap
HashMap:非线程安全
HashMap数据存储原理:
数组+链表+红黑树(JDK1.8后)、数组+链表(JDK1.7)
HashMap特性质:
以牺牲空间来换取时间,每个元素以键值对的方式进行存储;
添加元素时,会先计算哈希值进行位运算找到对应的桶位,
若桶位以有元素,将以链表的方式存在相同的桶位下,
当冲突严重链表的长度达到8时进行树(红黑树)化;
若元素个数达到集合容量的75%时(装填因子0.75),
将会触发扩容机制;
LinkedHashMap
LinkedHashMap:非线程安全
LinkedHashMap存储数据原理:
数组+链表+红黑树+双向链表(JDK1.8后)、数组+链表+双向链表(JDK1.7)
LinkedHashMap特性:
在继承HashMap的数据结构基础上多了双向链表,保持快速查询,还具有添加顺序与,遍历顺序相同的性质
TreeMap
TreeMap:非线程安全
TreeMap数据存储原理:红黑树
TreeMap特性:
继承于SortedMap接口
性质与红黑树性质相同
需要我们实现Comparable接口的实现类
提供比较规则;
Hashtable
Hashtable:线程安全(synchronize方法锁)
ConcurrentHashMap
ConcurrentHashMap:线程安全(Unsafe类+synchronize对象锁)
ConcurrentHashMap存储原理:和HashMap相同,在此基础上增加锁机制,解决高并发场景的数据安全问题
ConcurrentHashMap特性:
与HashMap相同,但与Hashtable在锁机制方面不同
ConcurrentHashMap使用Unsafe类提供的CAS(乐观锁 | 自旋锁)和synchronize对象锁
减少了锁的粒度,而Hashtable使用synchronize方法锁
当同时调用put方法时,需要等另一个线程执行完毕时释放锁,才能再次执行put方法;
注意事项:
当选择使用Hashtable不需要线程安全时,可选择使用HashMap
在高并发的情况下可选择ConcurrentHashMap
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


