4

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

Hashtable table = new Hashtable();
table.put(table, 1);
int code = table.hashCode();

我有两个问题:

  1. 当我像第三行代码一样调用hashCode方法时,为什么不是无限循环?我认为这是一个无限循环。

  2. 调试这段代码的时候,发现这段代码new Hashtable()会导致put方法的调用,为什么?

4

2 回答 2

7
  1. 根据我正在阅读的 OpenJDK 源代码,有一个专门编写的保护程序来防止 Hashtable 包含自身的情况。

  2. put在构造函数中看不到任何引用。您有可以在答案中发布的痕迹吗?

于 2013-07-25T01:55:16.413 回答
0

首先,使用哈希图,因为它在许多情况下会更好。

其次,这使用了Oracle的实现

这不是一个无限循环。HashTable.hashCode(只需遍历地图的元素一次。不是无限的。除非表包含自己,否则我在源代码中发现它确实非常hacky,但确实阻止了递归。在这种情况下,它会跳过计算返回 0 的自己的哈希码。

  1. 查看源代码,没有put(调用。只有下一行来电Put
于 2013-07-25T01:54:33.703 回答