List之LinkedList,ArrayList学习笔记

<------------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的 也能保证读到最新的值)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容