3

このコードの実行後、HashMap はどうなりますか?

HashMap m  = new HashMap();
for (int i = 0; i < 1024 * 1024; i++)
    m.put(i, i);
m.clear();

1M プット後、内部ハッシュ テーブルは元の 16 から 1MB に増加します。clear() は元のサイズにサイズ変更しますか?

4

2 に答える 2

4

いいえ。テーブルはそのサイズを保持します。すべての要素が次のように設定されていnullます。

public void clear() {
    modCount++;
    Entry[] tab = table;
    for (int i = 0; i < tab.length; i++)
        tab[i] = null;
    size = 0;
}
于 2013-02-08T06:09:22.590 に答える
2

これは実装の詳細であり、あなたが読んでいる API が 1M プットまたは内部ハッシュ テーブルについて何かを述べているかはわかりません。

実装を見てみましょう。

  620       /**
  621        * Removes all of the mappings from this map.
  622        * The map will be empty after this call returns.
  623        */
  624       public void clear() {
  625           modCount++;
  626           Entry[] tab = table;
  627           for (int i = 0; i < tab.length; i++)
  628               tab[i] = null;
  629           size = 0;
  630       }

http://www.docjar.com/html/api/java/util/HashMap.java.html#621

したがって、OpenJDK 7 実装は元のサイズを復元しません。

于 2013-02-08T06:09:27.363 に答える