Java集合

容器主要包括collection和map两种,map不是collection(set,list,queue)里的
Set treeset hashset linkedhashset
List arraylist linkedlist vector copyonwritearraylist
Quque linkedlist priorityquque
Map hashmap linkedhashmap concurrenthashmap

list可以允许重复对象和插入多个null值,而set不允许;list容器是有序的,而set容器是无序的

Arraylist基于数组实现,开始不分配内存,第一个加进去的时候才分配,默认10个。添加和删除元素都需要赋值大量对象。

Collections.synchronizedList(new ArrayList())后如果要用iterator还是需要给iterator加同步锁,因为这个方法没对Iterator加锁,对add啥的倒是加了。

CopyOnWriteArrayList适合读多写少的。因为它支持读写同时进行,但是写的时候要在新的数组里写然后原始数组指向新的数组,时间空间都不占优。而且可能出现实时性差的问题,写的过程中读不到最新的。

适配器模式(不能用基本类型数组做参数,可以用包装类型)和迭代器模式

HashMap一个Entry的数组,数组每个是一个桶,桶里是链表
HashMap的默认大小是16,可以传入不是2的n次方的大小,但是会自动转成2的n次方的大小,因为这样可以用二进制操作(桶的数量减一得到的数 和哈希值做 与运算)代替%运算,快很多。桶下标用求模取余数获得(key的哈希值%桶的数量),key为null,放第一个桶(下标0)。
装载因子是一个桶的容量,装载因子乘桶数是总容量,不够了就要扩容,扩容要创建新的然后全复制,慢,但是可以慢慢复制,一次转移一个,前表里没有了再删除前表。

JDK1.8开始,一个桶里元素大于等于8链表转红黑树

HashTable和HashMap类似,但是线程安全,使用了synchronized,但是是遗留类了,用ConcurrentHashMap就行了

ConcurrentHashMap在计算size时先尝试不加锁,连续两次得到的一样,就直接获得(但是不一定是第12次,可能是23或者34),但是最多尝试3次,超过就加锁。JDK1.7用分段锁,1.8用CAS,CAS失败用synchronized

LinkedHashMap,afterNodeAccess(),afterNodeInsertion()

ConcurrentCache用WeekHashMap实现的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值