解决idea调试HashMap源码时出现非预期key和value

前言

HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。不保证映射的顺序,特别是它不保证该顺序恒久不变。

需求背景

出于对技术源码的好奇,闲暇之余尝试去研究底层代码及数据结构,提升逻辑及编码能力。

问题发现

debug每个程序员必备的工具之一,可以让你快速的了解代码的调用关系,但是再研究HashMap底层时,发现debug传入的值和我定义的值不一样,我以为这是预加载的东西,点完即可,点了70多次idea的绿色箭头进入下次断点,这tm太多了吧,殊不知还有多少预加载的东西,超乎我的意料,让我无从下手,如图。
在这里插入图片描述

在这里插入图片描述

解决指南

我想了好久,不过最终还是解决了此问题。以put()方法为例:可以再第一次debug时,将断点去除,然后删除此节点,再重新put此节点且把断点再加上,进来时就不会再预加载类了,就能传入预料的值了。

注:不过即使删除节点后重新put(),但第一次初始化resize()方法已经完成,可以再第一次put()的resize()方法进行断点,执行完后再去除断点,按步骤执行。

步骤一:将断点打好

在需要debug的地方将断点打好,我们把断点打到第二put()方法上,这样在下次执行时不会直接结束,put()方法源码和resize()方法源码也打上断点,如图:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

步骤二:运行debug,去除断点,执行resize(),去除断点,进入下次执行

启动debug后,进入put()方法源码里,将断点去掉,直接运行idea的小绿箭头,进入下次初始化resize()方法
在这里插入图片描述
执行完resize()方法后去除断点,直接运行idea的小绿箭头,进入下次put()方法
在这里插入图片描述

步骤三:加上断点,继续执行

此时断点已经进入到第二个put()方法里面
在这里插入图片描述

在此之前先把之前去掉的断点加上,然后再执行,你就会发现已经传入预期的值了。
在这里插入图片描述
如果有更好的解决方案,欢迎评论区留言~。

扩展阅读

debug展示其它节点信息太少

很多人第一次阅读源码时,会遇到debug展示的节点信息太少了,就只有key和value信息,无法让我们准确的判断我们的推导是否正确,如图:
在这里插入图片描述
我们可以通过idea的左上角:file ➡ setting,来解决这个问题,把图中红色框框的勾选去除即可,如图:
在这里插入图片描述
再次展示,就看到我们其它节点信息了。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39940674/article/details/118030663
今日推荐