java.util.hashMap 中的 init 方法

Posted

技术标签:

【中文标题】java.util.hashMap 中的 init 方法【英文标题】:init method in java.util.hashMap 【发布时间】:2015-01-20 07:16:16 【问题描述】:

在查看java.util.HashMap 的源代码时,我发现了init 的声明。

子类的初始化钩子。在初始化HashMap 之后但在插入任何条目之前,在所有构造函数和伪构造函数(clonereadObject)中调用此方法。 (如果没有这个方法,readObject 需要明确的子类知识。)

void init() 

我发现了一个相关的问题In Java, is there a legitimate reason to call a non-final method from a class constructor?

但我仍然无法理解 init 的目的是什么以及为什么readObject 需要明确的子类知识?谁能举例说明一下

【问题讨论】:

恕我直言 - 一个好的做法是澄清任何剩余的疑问(如果有的话),或者接受答案。 【参考方案1】:

正如评论所说,它是子类的初始化钩子。每个子类都可以适当地覆盖 init() 以在每种情况下执行所需的任何初始化, 不必提供 readObject 的另一个实现以进行反序列化并自己重新实现 clone()

例如,在LinkedHashMap 中,init() 方法被重写以设置链表。想想如果init() 不可用,反序列化时会发生什么。

【讨论】:

如果 Hashmap 是最终类,则不需要使用不同的视图 init()。但由于它的可扩展性,我们也需要关心子类。

以上是关于java.util.hashMap 中的 init 方法的主要内容,如果未能解决你的问题,请参考以下文章

Java HashMap导致ClassCastException

JDK1.8源码——java.util.HashMap 类

java.util.HashMap和java.util.HashTable (JDK1.8)

java.util.HashMap 不能转换为 java.util.ArrayList

Java中的集合概述

Mabitis 多表查询resultType=“java.util.hashMap”