首页 > 其他分享 >【链表】关于链表结构

【链表】关于链表结构

时间:2022-09-27 11:13:50浏览次数:76  
标签:hash HashMap newTable next 链表 关于 Entry 结构

关于链表结构

每次看链表结构相关代码就有点晕,还看不明白,得想半天。看下面这篇分析的时候又感觉有点费劲了。
面试官: HashMap 为什么线程不安全?

这个问题以前了解过,时间一长就忘记了。先说结论:

JDK 1.7 HashMap 上的链表结构使用的头插法,并发情况会导致生成环形链表。这样 HashMap 轮循时会在环形链表上陷入死循环。

JDK 1.7 中 transfer 函数:

void transfer(Entry[] newTable, boolean rehash) {
        int newCapacity = newTable.length;
        for (Entry<K,V> e : table) {
            while(null != e) {
                Entry<K,V> next = e.next;
                if (rehash) {
                    e.hash = null == e.key ? 0 : hash(e.key);
                }
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];
                newTable[i] = e;
                e = next;
            }
        }
    }

未 resize 前的数据结构:

  1. 最开始 hash 表 size=2,key=3,7,5,则都在 table[1] 中。
  2. 然后进行 resize,使 size 变成 4。

table 遍历的是 3,7,5 链表

get, set 方法看习惯了,直接获取、设置 next 属性看着还挺别扭。好像是因为这个原因,理解起来有点障碍了。

Entry<K,V> next = e.next; 改写成 e.getNext()

e.next = newTable[i]; 改写成 e.setNext(newTable[i]);

理解起来就不一样了。

线程A挂起前:

  • next 已经先赋值为 7,5 链表。
  • newTable[i] 还没有元素,此时 e = 3,所以,e.next = newTable[i] ,即 3 指向了 null

先记住下面的描述方便理解:

  • e.nextnext 容易混淆,注意区分,两者是不同的变量。
  • 后续newTable[i] 指向的是链表头部,取值也直接取的头部。不涉及遍历的话不用关心链表其它位置的元素。
  • 链表 next 后,以 next 元素为头部,取其后的元素为组成的链表。不再包含前面的元素。关联单向链表对象来思考,对象只有 next 属性,没有 pre 属性。所以,会丢失前面的节点信息。

标签:hash,HashMap,newTable,next,链表,关于,Entry,结构
From: https://www.cnblogs.com/JamKing/p/16733826.html

相关文章

  • 关于 Web 组件的 5 个问题
    关于Web组件的5个问题在本文中,我们将尝试回答以下与Web组件相关的问题:什么是网络组件?webcomponents的一些基本原理是什么?webcomponents有哪些应用?webcompone......
  • leetcode -- 链表 2
    leetcode链表专题23.合并K个升序链表普通归并排序+python迭代器classSolution:defmergeKLists(self,lists:List[Optional[ListNode]])->Optional[ListNo......
  • 关于xp系统下,IE6/IE8不支持ssl证书站点的原因和解决办法
    xp系统本身最高只支持SSL3.0协议,后续的TLS1.1/1.2/1.3协议它都不支持,目前大部分网站都是TLS1.2版本的HTTPS,SSL3.0的基本上也不提供了,只有网站花大价钱,并且降低安全度的情况......
  • 482登录退出和483目录结构
    Mysql登录的三种方式第一mysql-uroot-proot 不要认为关闭窗口就能推出登录  exit推出 第二种加密方式  退出方式统一第三种 安装事鼠标所在位置勾......
  • 帧结构和物理资源(CRB,Resourcegrid,Resource-element和PointA)
    Resourcegrid  N.B.commonRB我们会在本文后半部分介绍,这里先简单介绍一下:commonresourceblock指的是在不同的numerology中,即对于某一种子载波间距配置,commonre......
  • 帧结构和物理资源(Numerologies,系统帧和子帧,时隙)
    之所以名字写这么长,是因为我发现后面的每个知识点的内容都很多,但是也不排除内容很少的知识点,所以为了查阅方便,我尽量一篇文章只写一个知识点,而如果知识点内容少,那我就把它......
  • 关于前端在线代码编辑器的问题
    前端在线代码编辑器实现的流程和插件这里不做过多赘述jq和vue都有对应的codemirror支持,注意vue2的引入版本就行这里将一些在测试过程中的发现提出1.如果单纯为js编辑,其......
  • leetcode -- 链表
    leetcode链表专题反转链表三指针+递归classSolution:defreverseList(self,head:Optional[ListNode])->Optional[ListNode]:defreverselist(......
  • 默写 翻转单链表(lc92)
    classSolution{publicListNodereverse(ListNodehead){if(head==null||head.next=0){returnhead;}ListNodelast=reverse(head.next);head.next.next=head;head.n......
  • 关于从“’四则运算程序‘例子出发, 逐步构建一个能解决实际问题的’软件‘”的思考
    1.首先根据作业要求写出一个简单的程序    它可以达到的效果为:首先运行程序,输入一个数字,该数字为想要生成的题目的数量,输入数字后能生成对应数目的题目和答案。题......