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
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。