码迷,mamicode.com
首页 > 编程语言 > 详细

Java集合

时间:2018-03-08 12:20:26      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:线程同步   碰撞   sync   eset   集合   put   gpo   shc   有序   

集合

 |--Collection

    |--List

      |--ArrayList: 底层数组, 线程不同步, 查询快

      |--LinkedList: 底层链表, 线程不同步, 增删快

      |--Vector: 底层数组, 线程同步, 查询增删都慢

    |--Set(底层使用的 Map 集合)

      |--HashSet: 底层 hash 表, 线程不同步, 无序

        |--LinkedHashSet: 有序

      |--TreeSet: 底层二叉树,  线程不同步, 元素排序

 |--Map

   |--HashMap: 底层 hash 表, 线程不同步, K-V 可为null

   |--Hashtable: 底层哈希表, 线程同步, K-V 不可为null

   |--TreeMap: 底层二叉树, 指定的K顺序排序

结论:

1.  数组查询快, 链表增删快

2. hash(散列)算法使得数据成散列分布, 插入和取出两次计算确定位置, 可能发生碰撞

3. 集合长度是可变的

根据结论可以得到如下推论:

1. 哈希(散列)表是数组和链表的组合,  不仅查询快, 而且增删快

2. 确保元素唯一的时, 先比较 hashCode(), 再比较 equals()

3. 解释了 ArrayList 和 HashMap 有自动扩容机制

技术分享图片

ArrayList

  |--源码 add() 没有 synchronized 关键字, 因而线程不同步

  |--初始大小为10, 容量不够则扩容为原来的1.5倍(>>1相当于 /2)

技术分享图片

 

技术分享图片

HashSet

  |--源码 add() 没有 synchronized 关键字, 因而线程不同步

  |--底层调用的 Map 集合的 put()

  |--K 已存在, 新 V 替旧 V, 元素不重复

技术分享图片

HashMap

  |--源码 put() 没有 synchronized 关键字, 因而线程不同步

  |--先比较 hash 值, 再用 equals() 比较

  |--K 已存在, 新 V 替旧 V

  |--初始大小为16, 负载因子0.75, 最大容量即12, 容量不够扩容为原来的 2倍 

技术分享图片

 

 技术分享图片

 

Java集合

标签:线程同步   碰撞   sync   eset   集合   put   gpo   shc   有序   

原文地址:https://www.cnblogs.com/sunjunxi/p/8526979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!