<------------linkedList和arrayList是线程不安全的
1.linkedlist:
LinkedList是List接口的(双向)链表实现。
2.arrayList:
arrayList是List接口可变数组的实现
<------------java的散列结构:
hashmap,hashtable,hashset,concurrentHashmap
<-----------hashmap,hashtable,concurrentHashmap区别
*HashTable:(数组+列表)key,value均不能为null
线程安全 操作数据时用synchronized锁整个hashtable
初始容量size=11 扩容规则 newsize = oldsize*2+1
index = (hash & 0x7FFFFFFF) % tab.length
(为了在hash为负值的情况下,去掉起符号位,所以和0x7FFFFFFF进行&操作
0x7FFFFFFF 二进制 0111 1111 1111 1111 1111 1111 1111 1111
负数与其进行&操作将产生一个正整数)
*HashMap:(数组+列表 +红黑树) key和value都可以为null
线程不安全的
初始容量size=16 扩容 newsize = oldsize*2
当加载因子到达75%时触发扩容 扩容针对整个Map 扩容时会将原来数组的元素重新取hash 重新放置
插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)
列表的长度size>8时 存储结构变成了红黑树
计算index方法:index = hash & (tab.length – 1)
树的长度小于6时,存储结构转为散列结构
*ConcurrentHashMap(分段数组+列表)线程安全
1.7(分段锁思想)
把整个Map分为N个Segment,可以提供相同的线程安全 效率提升N倍 默认提升16倍
数组(Segment) + 数组(HashEntry) + 链表(HashEntry节点)
底层一个Segments数组,存储一个Segments对象,一个Segments中储存一个Entry数组,存储的每个Entry对象又是一个链表头结点。
1.8
Node数组+链表 / 红黑树: 类似hashMap<jdk1.8>
Node数组使用来存放树或者链表的头结点,当一个链表中的数量到达一个数目时,会使查询速率降低,所以到达一定阈值时,会将一个链表转换为一个红黑二叉树,通告查询的速率。
(读操作是不加锁的 因为 HashEntry的value变量是volatile的 也能保证读到最新的值)