Java 当我创建一个新的哈希表时,为什么要对put方法进行调用?
我正在阅读Hashtable的代码,我很困惑,有一些问题。 我这样编码:Java 当我创建一个新的哈希表时,为什么要对put方法进行调用?,java,hashtable,Java,Hashtable,我正在阅读Hashtable的代码,我很困惑,有一些问题。 我这样编码: Hashtable table = new Hashtable(); table.put(table, 1); int code = table.hashCode(); 我有两个问题: 当我像第三行代码一样调用hashCode方法时,为什么它不是一个无止境的循环?我认为这是一个无止境的循环 当我调试这段代码时,我发现代码newhashtable()将导致调用put方法,为什么 首先,使用hashmap,因为它在许多情况下
Hashtable table = new Hashtable();
table.put(table, 1);
int code = table.hashCode();
我有两个问题:
hashCode
方法时,为什么它不是一个无止境的循环?我认为这是一个无止境的循环newhashtable()
将导致调用put
方法,为什么首先,使用hashmap,因为它在许多情况下更好 其次,这使用了Oracle的 这不是一个无限循环
HashTable.hashCode(
只需在映射元素中迭代一次,而不是无限次。除非该表包含自身,否则我发现它确实非常粗糙,但确实阻止了递归。在这种情况下,它会跳过计算返回0的自身哈希代码
put(
),只有下一行调用put
put
的引用。你有没有可以在回答中发布的跟踪信息但是,如果第一个元素是表本身,它看起来确实像是无止境的递归。我假设,通过“无止境循环”,user2331313意味着无限递归,而不是无限迭代。(因为表的哈希代码取决于它的所有键的哈希代码,包括它自己…)当我调试代码时,它不是一个无止境的循环。当的hashcode是invocated,它返回了0,因此它不是一个无止境的循环,但这没有任何意义。您能描述一下为什么您认为第三行应该是一个无限循环吗?Java中的每个对象都有一个hashcode,可以用来确定对象应该放在哈希表中的位置。哈希表和其他所有对象一样,可以放在其中哈希表,也需要哈希代码。请详细说明您如何看到
new Hashtable()
callput
。这会让人感到惊讶,而且很可能会混淆调试器实际显示的内容。也许您会看到紧跟在new Hashtable()之后的语句
,这是对put
的调用?@Joshua Taylor:因为Hashtable
的hashCode
是Hashtable
中元素的hashCode
的函数。您可以通过参考for映射来看到这一点。如果Hashtable
本身就是Ha>的一个元素shtable
,这就是OP的问题不是一个坏问题的原因。当我调试代码时,它不是一个无止境的循环。当键(hashtable)的hashcode被调用时,它返回0,所以它不是一个无止境的循环,但这没有意义。@Jason我没有说这是一个坏问题(事实上,它不是),但没有引用说明hashcode是表键的hashcode的函数的文档,现在还不清楚为什么有人会期望无限递归。@user2331313:如果在Hashtable.hashcode
中有逻辑来检测这种奇怪的情况并防止它引起infini,这是非常有意义的TE循环。在打开的JDK中是可用的,并且在<代码>哈希表的情况下显示返回零。HASCODE 被调用,而在<代码>哈希表的中间。HASCODE < /代码>调用完全相同的实例。杰夫:是Sun的实现吗?Oracle没有它。我不知道HashMap是否有相同的保护。(或落入无穷大)。从代码中的注释来看,这似乎是遗留代码的一个特定解决方案。@Thilo看起来像AbstractMap。hashCode
迭代并调用条目上的hashCode
,我没有看到任何这样的保护。如果我使用HashMap而不是Hashtable,它将进入一个无休止的循环。