Hash code和equals不在TreeMap,他和哈希 map的键有关。 - 详解
怎么文章又没了?








Hash code和equals不在TreeMap,他和哈希 map的键有关。

截图里代码的接口达成说明
这不是“实现HashMap中的接口”,而是建立了 Map 接口的内部接口 Map.Entry<K,V> ,具体解释如下:
1. 接口归属
static class Node<K,V> implements Map.Entry<K,V> :就是- 代码里写的
HashMap 自己定义的接口;就是- Map.Entry<K,V> 是 java.util.Map 接口中定义的内部接口,不
- HashMap 本身是 Map 接口的实现类,而 Node 作为 HashMap 的内部类,实现了 Map.Entry 接口,用来作为键值对的载体。
2. 为什么要实现 Map.Entry
通过Map.Entry 接口定义了“键值对”的主要行为(比如 getKey() 、 getValue() 等手段), HashMap.Node 搭建该接口后,就能够作为 Map 的“键值对元素”被遍历、处理,保证了和 Map 接口的规范一致。
3. 和HashMap的关系
- HashMap 本身实现了 Map 接口,而 Node 是 HashMap 用来存储具体键值对的内部节点;
- 你可以把 HashMap 理解为“容器”, Node 理解为容器里装“键值对”的“小盒子”,这个“小盒子”需要符合 Map.Entry 的规范,所以要实现对应的接口。
简单来说, Node 实现的是** Map 接口的内部接口**,不是 HashMap 自己定义的接口,这样才能让 HashMap 符合 Map 接口的要求,正确存储和操作键值对。

多张截图里HashMap相关内容的完整解读
这些截图都是 IDE 中展示 HashMap 源码的结构、方法归属和内部类实现,我帮你把每张图的关键信息拆开讲:
1. 方法归属与继承关系(带↑/→的办法)
以第一张和最终一张截图里的技巧为例:
- clear(): void ↑ AbstractMap :
clear() 方式是 继承自父类 AbstractMap , ↑ 表示“这个方法不是 HashMap 自己写的,是从父类继承来的”,调用 HashMap.clear() 时,实际执行的是 AbstractMap 里的实现。
- compute(K, BiFunction...) → Map :
compute() 方法是 构建自 Map 接口, → 表示“这个方式是 Map 接口定义的, HashMap 实现了它”,所以箭头指向 Map 接口。
2. HashMap的内部类(中间几张截图)
HashMap 的静态内部类,负责不同功能:就是截图里标注的 Node 、 KeySet 等
- static class Node<K,V> implements Map.Entry<K,V> :
HashMap 存储键值对的核心节点,每个 Node 涵盖 hash (键的哈希值)、 key (键)、 value (值)、 next (下一个节点的引用,克服哈希冲突时形成链表/红黑树)。就是Node
它实现了 Map.Entry 接口,所以能作为 Map 的键值对载体。
- KeySet :
是 HashMap 的内部类,实现了 Set<K> 接口,调用 HashMap.keySet() 时会返回 KeySet 的实例,用来表示“所有键的集合”,支持遍历和运行键。
- Entry :
是 Map 接口的内部接口( Map.Entry ), HashMap.Node 实现了这个接口,所以 Entry → Map 表示“ Entry 属于 Map 接口的内部成员”。
3. HashMap的关键常量(最后几张截图)
截图里的 UNTREEIFY_THRESHOLD = 6 和 MIN_TREEIFY_CAPACITY = 64 是 HashMap 的树化/反树化阈值:
- MIN_TREEIFY_CAPACITY = 64 :
当 HashMap 的容量≥64,且某个“桶”里的节点数≥8时,这个桶会从链表转为红黑树(提高查询效率)。
- UNTREEIFY_THRESHOLD = 6 :
当红黑树里的节点数≤6时,会从红黑树转回链表(节省内存)。
4. 方法的返回值标注(最后一张截图里的 void )
截图里方法后面的 void / int / V 是方法的返回值类型,比如:
- clear(): void 表示 clear() 方式没有返回值;
- capacity(): int 表示 capacity() 方法返回一个 int 类型的容量值;
- compute(...) : V 表示 compute() 方法返回一个 V 类型的值(对应 HashMap 的值类型)。
要不要我
帮你整理一份HashMap核心内部类与常量的功能速查表,让你快捷记住每个部分的作用?
截图里“void”的具体含义
在Java中, void 是一种返回值类型,专门用来表示方法没有返回值——也就是这个方法执行完后,不会向调用它的地方返回任何数据。
结合截图里的例子说明
看截图里的 afterNodeRemoval(Node<K, V>): void :
- 方法名是 afterNodeRemoval ,参数是一个 Node 类型的对象;
- 后面的 void 表示:当你调用这个方法时,它只会执行一些逻辑(比如在 HashMap 中,这个途径是在节点被移除后做一些后续处理,比如维护链表/红黑树的结构),但不会返回任何结果给调用者。
和其他返回值类型的区别
举个对比例子:
- capacity(): int 里的 int 表示这个手段会返回一个整数( HashMap 的当前容量);
- compute(...) : V 里的 V 表示这个途径会返回一个 V 类型的值( HashMap 中对应“值”的类型);
- 而 void 则是“没有返回值”的专用标记。
容易来说, void 就是告诉编译器和开发者:“这个方法只负责做事,做完了不会给你回传任何东西”。
要不要我帮你整理一份Java常见返回值类型(void、int、V等)的用法对照表,让你高效区分不同返回值的作用?

工具方式,静态方法。

不确定个数的时候可以直接用类型名三个点,然后名字,它会自动创建一个数组。


浙公网安备 33010602011771号