2016-12-25 7 views
-1

500個の要素でHashMapを初期化しようとしていますが、すべて0に設定されています。私はラムダforEachループを使ってみましたが、ラムダループの完了後でさえ、マップのサイズはまだゼロです。 私はメモリがput操作のために割り当てられる時を知りたいと思っていました。HashMap要素にメモリが割り当てられるのはいつですか?

Map<Integer, Integer> map = new HashMap<>(500); 

map.keySet().forEach(i -> map.put(i, new Integer(0))); 

System.out.println("Size of the HashMap using Lambda forEach loop: " + map.size()); 

for (int i=0; i < 500; i ++){ 
    map.put(i,0); 
} 

System.out.println("Size of the HashMap using regular for loop: " + map.size()); 

出力:

Size of the HashMap using Lambda forEach loop: 0 
Size of the HashMap using regular for loop: 500 

PS:私は別の方法がJava8を使用している理解は、ハッシュマップに要素を追加するためのストリームが、私はput操作を知ることに、より興味を持っています。

+0

マップのキーを反復していますが、まだ地図に何も配置していません。したがって、keySetは空です。驚くべきことは? –

+0

マップが空でない場合、それを反復処理中に 'put'を呼び出すことは壊れているとみなされなければなりません。さらに、新しい整数(0)のポイントは何ですか? – Holger

+0

HashMap のキーは、0..N-1だけでなく、例えば、それらは完全に100010000050310010021001501などである可能性があります。キーが常に0..N-1の場合、HashMapよりも効率が良いように(組み込みの)配列またはArrayListを使用できます。 –

答えて

4
Map<Integer, Integer> map = new HashMap<>(500); 

は空Setを返す500

したがってmap.keySet()の初期容量で空の地図を作成し、forEachコールは何もしません。

私は、あなたがMapMapにはすでになかったすなわちキー)で新しいキーを置くたびメモリがput操作

用に割り当てられますとき、知りたい新しいましたMap.Entryインスタンスが作成されます。それはメモリが割り当てられたときです。

与えられた容量のHashMapをインスタンシエートすると、Mapのエントリを保持する最初のアレイのメモリだけが割り当てられます(アレイの割り当てが遅延する可能性があるため、必ずしも真ではありません)。

+0

簡単な説明をありがとうございます。 –

関連する問題