1、Collection

###List
ArrayList,Vector,LinkedList

##ArrayList
ArrayList是线程不安全的,原因:多线程环境下,put的时候,值会出现null
默认长度:10
每次扩容:size>>1 原长度的一半

性能:
查询:因为ArrayList是带下标的index,所以查询的时候,查询速度快
修改:put的时候,看是否需要扩容。如果扩容,则copy原来的数据,扩容后addAll
ArrayList添加的时候,如果追加到最后,性能高,如果新增不在数组的最后一位,则需要移动下 标

##Vector
Vector只是在方法的前面加了synchronized(重量级锁),会锁住整个Vector对象
不建议使用。一般是在数组外做锁的处理

##LinkedList
链表结构,内部是Entry对象,Entry对象的属性。prev(前驱节点) next(后驱节点)
性能:
查询:因为是链式结构,只能遍历列表,效率没有ArrayList高
新增:有2个方法,add(Entry) 只有1个参数的,就是在列表后面新增一个节点
add(int,Entry) 有2个参数的,第一个参数是节点的第几位,第二个是新增的节点。
这时候,先拿到列表的长度,如果大于一半,则从后面递减轮循,如果小于一半,则从前面循环,直到找到该位置的对象,把新增的节点放到该位置。这时,只需要修改2个节点。
1、把老节点的prev属性,替换到新节点的prev属性
2、把新节点的next属性,指向老节点
3、把老节点的prev属性,替换为新节点。
所以新增的性能会比较高

###Map

HashMap,HashTable,ConcurrentHashMap

##HashMap
JDK1.7 : 数组+链表
JDK1.8:数组+链表+红黑树

默认:16
加载因子:0.75
什么时候扩容:size > size*0.75 会扩容2倍

线程不安全:扩容,在put的时候,会重新进行Hash的,如果存入数组中的位置改变,则获取不到值。

HashMap继承了Object的特性
Hash 决定存放的位置 equals 决定是否相等
Hash碰撞:两个K的HashCode一样,如果equals相等的话,会替换该位置的数据
如果两个K的HashCode一样,并且equals不相等的话,则会出现Hash碰撞,会在链上新增节点。。
如果是JDK1.8的情况下,什么时候会用红黑树(二分查找法):
如果一开始用红黑树,则性能不如1.7的性能高,JDK1.8在判断链上大于8的时候,会使用红黑树。

##HashTable
在HashMap的方法中添加了synchronized

##ConcurrenctHashMap
1、会Hash两次,Hash一次效率太低,HashCode的后缀基本上都一样
2、Segment数组+链表结构
Segment 继承extends ReentactLock,分段锁,是将锁整个对象的,改为锁住数组的每一个Hash位(Segment),提高了性能。
3、size() 计算每个Segment节点的长度,再相加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值