java.Map使用上の注意点


詳細
セット、HashMap、HashSet、HashTableのセットに要素を追加すると、セットはまずオブジェクトのhashCodeメソッドを呼び出し、格納されている場所を直接特定でき、他の要素がなければ直接保存できます.すでに要素が存在する場合は、equalsメソッドを呼び出して、2つの要素が同じかどうかを一致させ、同じ場合は保存されず、異なる場合は他の位置にハッシュされます(すなわち、hash後の値に再基づいてhash値を実行し、再帰を実行するのと同じです).
Treemap key値は順番に並べられ、hashmapのkey格納位置はhashcodeによって決まるので無秩序である.
hashmapが同時アクセスを必要とする場合:Mapm=Collections.synchronizedMap(new HashMap(…));
hashMapで使用されるパフォーマンスに関する詳細にも注意してください.

public static void main(String[] args) {
		Map map = new HashMap<>();
		Date d = new Date();
		for (int i = 0; i < 10000000; i++) {
			map.put(i, null); 
		}
		Date d1 = new Date();
		System.out.println(d1.getTime()-d.getTime());

		Map map1 = new HashMap<>(10000000); 
		for (int i = 0; i < 10000000; i++) {
			map1.put(i, null); 
		}
		Date d2 = new Date();
		System.out.println(d2.getTime()-d1.getTime()); 
	}

HashMapを使用する場合、初期容量が予め供給されていなければ、容量を超えるたびに、自動的に拡張する場合、key値はhash値に基づいて決定されるため、key値に対してrehash操作が必要となる.大量のメモリ消費を招くのでhashmapを使用する場合は、初期容量を正しく設定することをお勧めします
実行結果:

5897
2694

総合的にmapの使用
JAvaはデータ構造におけるマッピングにインタフェースjavaを定義する.util.Map;4つの実装クラスがあり、それぞれHashMap Hashtable LinkedHashMapとTreeMapである.
Mapは主に健値ペアを格納するために用いられ,キーに基づいて値が得られるため,キーの繰返しは許されない(上書きが繰り返される)が,値の繰返しは許される.
Hashmapは最も一般的なMapであり、キーのHashCode値に基づいてデータを格納し、キーに基づいて直接その値を取得することができ、アクセス速度が速く、遍歴時間があり、データを取得する順序は完全にランダムである.HashMapは最大1つの記録を許可するキーがNullである.複数のレコードを許可する値はNullです.HashMapはスレッドの同期をサポートしていない.すなわち、任意の時点で複数のスレッドが同時にHashMapを書くことができる.データの不一致を引き起こす可能性があります.同期が必要な場合は、CollectionsのsynchronizedMapメソッドを使用してHashMapを同期させるか、ConcurrentHashMapを使用します.
HashtableはHashMapと同様にDictionaryクラスから継承されていますが、記録されたキーや値が空であることは許可されていません.スレッドの同期をサポートします.つまり、いずれの時点でも1つのスレッドだけがHashtableを書くことができるため、Hashtableが書き込み時に遅くなります.
LinkedHashMapはHashMapのサブクラスである、記録の挿入順序を保存しており、IteratorでLinkedHashMapを遍歴する際に、先に得られた記録は必ず先に挿入する.また、構築時にテープパラメータを用いて、適用回数順に並べ替えることもできます.巡回する場合はHashMapよりも遅くなりますが、例外として、HashMapの容量が大きく、実際のデータが少ない場合、巡回する速度はLinkedHashMapよりも遅くなる可能性があります.LinkedHashMapの巡回速度は実際のデータにのみ関係し、容量に関係なく、HashMapの巡回速度は彼の容量に関係します.
TreeMapはSortMapインタフェースを実現し、保存したレコードをキーに従ってソートすることができ、デフォルトではキー値の昇順ソートであり、ソートの比較器を指定することもでき、IteratorでTreeMapを巡ると、得られるレコードはソートされます.
一般的には、最も多く使われているのはHashMapで、Mapに要素を挿入、削除、位置決めし、HashMapが最善の選択です.ただし、キーを自然な順序またはカスタム順序で巡回する場合は、TreeMapがより良いです.出力の順序が入力の順序と同じである必要がある場合はLinkedHashMapで実現することができ、読み出し順序で並べ替えることもできる.
HashMapは最も一般的なMapで、キーのhashCode値に基づいてデータを格納し、キーに基づいて直接値を取得することができ、アクセス速度が速い.HashMapでは、最大1つのレコードのみを許可するキーがNULLであり、複数のレコードを許可する値がNULLである.
HashMapではスレッド同期はサポートされていません.つまり、任意の時点で複数のスレッドが同時にHashMapを書くことができ、データの不一致を招く可能性があります.同期が必要な場合は、CollectionsのsynchronizedMapメソッドを使用してHashMapを同期させることができます.
HashtableはHashMapと似ていますが、記録されたキーや値が空であることは許可されていません.スレッドの同期をサポートします.つまり、いずれの時点でも1つのスレッドだけがHashtableを書くことができるため、Hashtableが書き込み時に遅くなります.
LinkedHashMapは記録の挿入順序を保存しており、IteratorでLinkedHashMapを巡る場合、先に得られた記録は必ず先に挿入される.
巡回時にはHashMapよりも遅くTreeMapで保存されているレコードをキー順に並べ替えることができますが、デフォルトでは昇順で並べ替えるか、並べ替えの比較器を指定することもできます.TreeMapをIteratorで巡回すると,得られた記録は順序付けされている.
同時プログラミングでは、copyonwritearraylist concurrenthashmapを使用してマルチスレッドの読み書きを最適化することが多い
パフォーマンス要件の場合、weakhashmapを使用すると自動的にgcのmapになります