从一个并发异常问题引起的想法
1.HashMap 的底层:
数组+链表/红黑树
2.几个变量和常量:
默认的初始容量=1<<4 =>16(左移-->2 的 4 次方;
**MaxMum_capacity=1<<30 最大的容量;
(3)Default_load_Factor:默认的加载因子 0.75;
(4)threshold:树化阈值
数组后面一个元素的链表的元素
是八个---就要考虑--是一个树形(查询变快;);
(5) 反树化--要是数值比 6 小---考虑的是变成链表;
树--删除成 6 变成-0-链表
链表多啦---元素多啦---直接是变成树;
(6)当单个链表的结点为 8 个,但是 table 的长度为 64,才会树化;
当单个链表的结点为 8 个,但是 table 的长度未达到 64,会扩容;
2.JDK1.8 的源码分析:
(1)初始化:
(2)添加的问题:
然后是开始进行 put:
--创建一个默认的 16 的数组,
阈值为 12
阈值到达 12 之后--增加到 2 倍;
\
新数组的容量是 16 的 2 倍 32;
3.集合中 ModCount 的作用:
每个集合中都有;
transient int modCount;\
记录的是当前集合被修改的次数:
add()或者是 remove()
当自己 modCOUNT 的记录数和这个 ExpectCount 不一致-----》并发修改异常
一个在 add() ModCount 增加 1;
要是不一致--直接是输出异常;
导致的 currentModificationException()的并发修改异常;
记录一下并发修改异常:
如果我们想过滤出其中的对象,组成一个新的集合:我建议使用 stream 流中的 filter 的作为过滤条件;
如果说是两个集合进行对比过滤:
我的建议是将,单个 list 集合转化成 map; key-value,其中 value 是哪个对象;
接着遍历另外一个集合,从而判断出需要过滤后的新集合;
版权声明: 本文为 InfoQ 作者【卢卡多多】的原创文章。
原文链接:【http://xie.infoq.cn/article/6670e619ef26d06a9e7ad826f】。文章转载请联系作者。
评论