Java 当我创建一个新的哈希表时,为什么要对put方法进行调用?

Java 当我创建一个新的哈希表时,为什么要对put方法进行调用?,java,hashtable,Java,Hashtable,我正在阅读Hashtable的代码,我很困惑,有一些问题。 我这样编码: Hashtable table = new Hashtable(); table.put(table, 1); int code = table.hashCode(); 我有两个问题: 当我像第三行代码一样调用hashCode方法时,为什么它不是一个无止境的循环?我认为这是一个无止境的循环 当我调试这段代码时,我发现代码newhashtable()将导致调用put方法,为什么 首先,使用hashmap,因为它在许多情况下

我正在阅读Hashtable的代码,我很困惑,有一些问题。 我这样编码:

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()
    call
    put
    。这会让人感到惊讶,而且很可能会混淆调试器实际显示的内容。也许您会看到紧跟在
    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,它将进入一个无休止的循环。