我正在阅读Hashtable
的代码,我很困惑并且有一些问题。
我这样编码:
Hashtable table = new Hashtable();
table.put(table, 1);
int code = table.hashCode();
我有两个问题:
当我像第三行代码一样调用hashCode
方法时,为什么它不是无限循环?我认为这是一个无限循环。
当我调试此代码时,我发现代码new Hashtable()
将导致调用put
方法,为什么?
答案 0 :(得分:7)
根据the OpenJDK source I'm reading,有一个专门用来防止Hashtable包含自身情况的警卫。
我在构造函数中看不到对put
的任何引用。你有答案可以在你的答案中发表吗?
答案 1 :(得分:0)
首先,使用散列图,因为在许多情况下它更好。
其次,这使用了Oracle的implementation。
这不是一个无限循环。 HashTable.hashCode(
只需迭代地图的元素一次。不是无限的。除非表中包含自己,否则在source中我发现它确实非常hacky但确实阻止了递归。在这种情况下,它会跳过计算自己的哈希码,返回0。
put(
。只有下一行会调用Put
。