Java 集合小记

结论:

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

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

3. 集合长度是可变的

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

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

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

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

集合

 |--Collection

    |--List

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

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

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

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

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

        |--LinkedHashSet: 有序

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

 |--Map

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

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

   |--TreeMap: 底层红黑树, 指定的 K 顺序排序

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倍 

 

 

 TreeMap

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

  |--红黑树需要每次调用平衡算法

 

 

转载于:https://www.cnblogs.com/sunjunxi/p/8526979.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值