您的位置:首页 > 其它

集合知识点梳理

2019-10-15 19:18 162 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Syntactic_tang/article/details/102572967

集合在java中的结构.

父接口 Collection

子接口 List Set

实现类.
ArrayList LinkedList Vector HashSet,TreeSet,LinkedHashSet

ArrayList LinkedList Vector 区别.

Vector底层是数组.
线程安全. 速度慢.
ArrayList底层是数组.
线程不安全,查询比较速度,增删比较慢.
LinkedList底层是链表
线程不安全,增删较快,查询较慢.

HashSet,TreeSet,LinkedHashSet 区别.

不允许重复.存取无序.
HashSet本质是HashMap中的key

TreeSet基于Compartor -> compare方法

LinkedHashSet存取有序.

HashMap.

jdk1.7 -> 底层是数组 + 链表.
jdk1.8 -> 底层是数组 + 链表 + 红黑树.

jdk1.8引入红黑树的原因:
当出现hash冲突|碰撞时,value会挂在数组后面的链表上.当链表长度过长时,会导致查询效率比较低. 在链表长度大于等于8时,会从链表转换为红黑树,当链表长度小于等于6时,从红黑树转为链表.

jdk1.8为了实现红黑树,将Entry包装为Node.可以旋转变色.

HashMap是如何避免hash冲突出现的.
(h = key.hashCode()) ^ (h >>> 16)

HashMap线程不安全.

为什么?

Hashtable -> 效率太低.
所有写方法直接变成synchronized方法.
ConcurrentHashMap ->
jdk1.7
数组 + 链表.
Segment -> ReentrantLock
初始化了长度为16的Segment -> 将HashMap根据Hash分散到不同的Segment中.
jdk1.8
数组 + 链表 + 红黑树.
CAS + synchronized.

  1. 当没有hash冲突时,采用CAS乐观锁的方式,不会锁住HashMap,尝试添加.
  2. 当出现hash冲突时,会使用synchronized锁住链表.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: