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
之后但在插入任何条目之前,在所有构造函数和伪构造函数(clone
、readObject
)中调用此方法。 (如果没有这个方法,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
java.util.HashMap和java.util.HashTable (JDK1.8)