Java集合归纳总结

我们讲集合,就是Collection顶级接口下包括的一些常用集合数据结构,大致分为三类:List(可重复元素集)、Map(KV映射集)、Set(不可重复集)、Queue(队列)

总结:
1、ArrayList:底层数组,支持O(1)的时间复杂度根据下标的随机访问,在指定位置插入数据会触发底层数组拷贝,数据量大的时候性能较差。
2、LinkedList:底层单向链表,支持O(1)的时间复杂度增删元素,在随机访问链表属性时需要从头遍历,数据量大的时候性能较差。
3、Vector:底层数组,所有操作都通过synchronized加上同步锁,增删查读性能较差,线程安全场景建议CopyOnWriteArrayList
4、SynchronizedList:与Vector相比,使用synchronized同步代码块加锁,可以指定锁的对象,底层数据结构可以自由选择ArrayList或者LinkedList,这一点也是Vector不具备的。
5、CopyOnWriteArrayList:底层volatile 修饰数组,持有ReentrantLock保证写安全,写时复制,读的时候读copy副本,读写锁分离所以性能较好,不过存在内存占用和数据一致性的问题,如果需要数据的强一致性,请勿使用,适合读多写少的场景。
6、HashSet:底层HashMap的Key,hashMap的value是一个常量new Object(),无序不重复,允许null值,
7、TreeSet:底层是一个TreeMap,通过红黑树的特性保证key的有序性。
8、LinkedHashSet:集成HashSet,基于linkedHashMap的单链表队列实现。
9、CopyOnWriteArraySet:基于CopyOnWriteArrayList,使用indexOf保证无重复数据
10、PriorityQueue:优先级队列,底层实现为完全二叉树,实现Comparator接口,不允许元素为null,线程不安全,线程安全需要使用PriorityBlockingQueue
11、LinkedBlockingQueue:单链表阻塞队列,内部持有两个ReentrantLock(putLock、tackLock)保证任务元素的出入对线程安全,持有两个Condition(notFull、notEmpty),通过各自的awit和signal实现等待和唤醒。
12、ArrayBlockingQueue:数组阻塞队列,与LinkedBlockingQueue相比区别主要有以下几个方面:初始容量(有界无界)、存储结构(node链表、数组)、出入队锁(Link两个、Array一个)。
13、HashMap:非线程安全,HashEntry数组+链表(红黑树)、尾插法、add触发初始扩容rehash。
14、LinkedHashMap:双向链表+HashMap,默认插入有序(还有访问有序)
15、TreeMap:非nullkey,并需要实现Comparator接口,基于红黑树保证key有序。
16、ConcurrentHashMap:hashMap+CAS(synchronized),先使用CAS乐观锁,不行进行锁升级synchronized,锁的对象为插入位置的Node节点,锁粒度变小,性能提高。
17、SynchronizedMap:同步版HashMap,方法都用synchronized同步代码块保证并发安全,并发安全但性能较差
18、HashTable:方法都用synchronized修饰,锁住当前对象,粒度>=SynchronizedMap,已弃用。

面试重点:
1、ArrayList和LinkedList的区别?(基础)
ArrayList随机下标访问性能高(数组),内部插入效率低(尾插都一样)
LinkedList中间插入性能高(链表)、随机下标访问效率差(需从头遍历)。
2、线程安全的List有吗?了解其原理吗?使用场景分别是什么?有什么弊端?(进阶)
线程安全的List有SynchronizedList和CopyOnWriteArrayList,Vector(弃用),原理弊端见上总结,数据强一致性用SynchronizedList,非强一致性且读多写少场景用CopyOnWriteArrayList
3、HahsMap的底层原理?相比1.7,1.8对于hashMap有什么改进提升?(基础)
1.7:HashEntry数组+链表(底层结构)、头插(并发取值链表成环get死循环)、new触发数组初始化。
1.8:HashEntry数组+链表+红黑树(底层结构)、尾插、add触发数组初始化,阈值8触发树化,阈值8 - 1 触发反树化。
4、并发安全的Map有吗?说说其原理?(进阶)
ConcurrentHashMap、SynchronizedMap,hashTable(弃用)原理见上总结内容

以上就是个人对于Java集合的一些理解,要是大家觉得对你有帮助,就帮忙点个赞吧,谢谢

posted @ 2020-11-06 10:28  邱志强  阅读(121)  评论(0编辑  收藏  举报