在看Java HashMap工作原理及实现这篇文章时,发现博主在断点模式下来观察hash冲突的效果挺好的,随后便想在IntelliJ IDEA中也试下。

我们先来看下HashMap.Node的代码,有4个成员变量。

1
2
3
4
5
6
7
static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
        //省略后续内容
}

如下图所示,对于HashMap.Node类型的对象,IDEA默认只显示了key,value这两个成员变量。

原因在于IDEA默认将HashMap.Node视为了Map.Entry,那么如何在Debug时以HashMap.Node的类型来查看该对象其他变量呢?

方法有二:

一. 在debugger的Variables面板中,右键该对象,找到View As选项,选择其中的Object,然后就可以看到该对象的所有属性了。

二. 采用第一种方式时,每次Debug都需要手动指定其类型,较为繁琐。对于常用的类,我们也可以在View as时点击Create按钮,为其新建类型。这样的话以后每次Debug时,无需任何设置就能在Variables面板内直接看到其准确类型的所有属性。

Create过程也很简单,在Java Type Renders窗口内,设置HashMap$Node对应的完整类名即可,如下图所示。

最后看一下,在View as中Create了HashMap及HashMap.Node后的效果。

现在已经能看到类中的所有成员变量了,那么对于静态变量该如何查看呢?这个也很简单,同样在此处右键,点击Customize Data Views…

然后在Static fields和Static final fields的选项前打勾即可~

以HashMap为例,在选中了Static fields和Static final fields的选项后,所有的静态变量也显示出来了 :)