4

のコードを読んでいてHashtable混乱しており、いくつか質問があります。私はこのようにコーディングしました:

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

2 つの質問があります。

  1. hashCode3 行目のコードのようにメソッドを呼び出すと、無限ループにならないのはなぜですか? 無限ループだと思います。

  2. このコードをデバッグすると、コードnew Hashtable()によってputメソッドが呼び出されることがわかりました。なぜですか?

4

2 に答える 2

7
  1. 私が読んでいるOpenJDKソースによると、Hashtableにそれ自体が含まれている場合を防ぐために特別に書かれたガードがあります。

  2. putコンストラクタ内への参照はありません。回答に投稿できるトレースはありますか?

于 2013-07-25T01:55:16.413 に答える
0

まず、多くの場合、ハッシュマップの方が優れているため、ハッシュマップを使用します。

次に、これは Oracle の実装を使用します。

無限ループではありません。HashTable.hashCode(マップの要素を1 回繰り返すだけです。無限ではありません。テーブルにそれ自体が含まれていない限り、ソースで私が見つけた場所は確かに非常にハックですが、再帰を防ぎます。その場合、0 を返す独自のハッシュ コードの計算をスキップします。

  1. ソースを見ると、noput(が呼び出されています。次の行だけが を呼び出しますPut
于 2013-07-25T01:54:33.703 に答える