昨日、私のクラスで教授がハッシュを教えていましたが、ハッシュマップがどのようにオブジェクトを保存するのか知りたいのですか?
エントリークラスの件、承知いたしました。
しかし、arraylist はデフォルトで 10 要素で開始できること、またはコンストラクターでこれを設定できることを知っています。設定されている要素がさらに必要な場合は、値をコピーする別の配列を作成します...
では、ハッシュマップはどのように成長するのでしょうか?
ありがとう
昨日、私のクラスで教授がハッシュを教えていましたが、ハッシュマップがどのようにオブジェクトを保存するのか知りたいのですか?
エントリークラスの件、承知いたしました。
しかし、arraylist はデフォルトで 10 要素で開始できること、またはコンストラクターでこれを設定できることを知っています。設定されている要素がさらに必要な場合は、値をコピーする別の配列を作成します...
では、ハッシュマップはどのように成長するのでしょうか?
ありがとう
javadocから直接:
HashMap のインスタンスには、そのパフォーマンスに影響を与える 2 つのパラメーターがあります。それは、初期容量と負荷係数です。容量はハッシュ テーブル内のバケットの数であり、初期容量は単にハッシュ テーブルが作成された時点の容量です。負荷率は、容量が自動的に増加する前に、ハッシュ テーブルがどれだけいっぱいになることができるかの尺度です。ハッシュ テーブルのエントリ数が負荷係数と現在の容量の積を超えると、ハッシュ テーブルが再ハッシュされ (つまり、内部データ構造が再構築され)、ハッシュ テーブルのバケット数が約 2 倍になります。
(私のものを強調)
実装の詳細が必要な場合は、ソース コードも JDK と共に配布されます。
にはEntryのHashMap
内部配列があり、他のサイズが指定されていない場合はデフォルトで 16 になります。
実際のマップサイズを確認できる小さなコードを作成しました。これは内部配列サイズであるため、比較できます。for ループを変更して、必要なだけ拡張できるようにします。
public static void main(String[] args) throws Exception{
HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
for(int i = 0 ; i < 100 ; i++){
m.put(i, i);
Field table = m.getClass().getDeclaredField("table");
table.setAccessible(true);
int tableLength = ((Entry[])table.get(m)).length;
System.out.println("Map size: " + m.size());
System.out.println("Internal table size: " + tableLength);
}
}