Java集合

江枫思渺然 提交于 2020-03-03 15:40:34

容器主要包括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实现的

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!