ホームページ >Java >&#&チュートリアル >Java での HashMap トラバーサルと使用例の詳細な説明
マップのいくつかの走査方法:
Map< String, String> map = new HashMap<>(); map.put("aa", "@sohu.com"); map.put("bb","@163.com"); map.put("cc", "@sina.com"); System.out.println("普通的遍历方法,通过Map.keySet遍历key和value");//普通使用,二次取值 for (String key : map.keySet()) { System.out.println("key= "+key+" and value= "+map.get(key)); } System.out.println("通过Map.entrySet使用iterator遍历key和value:"); Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while(it.hasNext()){ Map.Entry<String, String> entry = it.next(); System.out.println("key= "+entry.getKey()+" and value= "+entry.getValue()); } System.out.println("通过Map.entrySet遍历key和value"); //推荐这种,特别是容量大的时候 for(Map.Entry<String, String> entry : map.entrySet()){ System.out.println("key= "+entry.getKey()+" and value= "+entry.getValue()); } System.out.println(“通过Map.values()遍历所有的value,但不能遍历key”); for(String v : map.values()){ System.out.println("value = "+v); }
HashMap と Hashtable の接続と違い
実装原理は同じ、機能は同じ、最下層はハッシュ テーブル構造、クエリ速度は高速で、多くの場合相互運用できるため、以前のバージョンは一般に安全です。
HashMap と Hashtable は両方とも Map インターフェイスを実装していますが、どちらを使用するかを決定する前に、まずそれらの違いを理解する必要があります。主な違いは、スレッド セーフ、同期、速度です。
HashMap は Hashtable とほぼ同等ですが、HashMap が非同期で null を受け入れることができる点が異なります (HashMap は null のキーと値を受け入れることができますが、Hashtable は受け入れることができません)。
HashMap は非同期ですが、Hashtable は同期されます。つまり、Hashtable はスレッドセーフであり、複数のスレッドが Hashtable を共有できますが、正しく同期しないと、複数のスレッドは HashMap を共有できません。 Java 5 は ConcurrentHashMap を提供します。これは HashTable の代替品であり、HashTable よりも優れたスケーラビリティを備えています。
もう 1 つの違いは、HashMap の反復子 (Iterator) はフェイルファスト反復子であるのに対し、Hashtable の列挙反復子はフェイルファースト反復子ではないことです。そのため、他のスレッドが HashMap の構造を変更する (要素の追加または削除) と、ConcurrentModificationException がスローされますが、要素を削除するときにイテレーター自体の Remove() メソッドは ConcurrentModificationException をスローしません。ただし、これは保証された動作ではなく、JVM に依存します。これは列挙型と反復子の違いでもあります。
Hashtable はスレッドセーフで同期されているため、シングルスレッド環境では HashMap よりも遅くなります。同期が必要なく、単一のスレッドのみが必要な場合は、HashMap を使用した方が Hashtable よりもパフォーマンスが高くなります。
HashMap は、Map 内の要素の順序が時間が経っても変わらないことを保証できません。
hashmapの特徴
HashMapはマップインターフェースのサブクラスであり、キーを値にマッピングするオブジェクトであり、キーと値は両方ともオブジェクトであり、スレッドセーフではありません
hashMapはハッシュテーブルを使用して、マップキーを保存する
キーは順序付けされておらず一意であり、1 つの null を持つことができます
値は順序付けされておらず一意ではなく、null のペアを持つことができます
linkedHashMap はマップ内にキーを格納するためにハッシュ テーブルを使用し、リンクされた二重リンク リストを使用します注文を管理するため
私たちはこれを最もよく使用します。HashMap は、Map 内の要素の挿入、削除、検索に最適です。出力順序を入力順序と同じにする必要がある場合は、LinkedHashMap を使用して、読み取り順序に並べることもできます。HashMap は、hashCode 値に従ってデータを保存します。高速なアクセス速度でキーの値を直接取得します。 HashMap では、1 つのレコードのキーが NULL になることのみが許可され、複数のレコードの値が NULL になることが許可されます。 HashMap はスレッド同期をサポートしていません。つまり、複数のスレッドがいつでも同時に HashMap を書き込むことができるため、データの不整合が発生する可能性があります。
同期が必要な場合は、Collections の synchronizedMap メソッドを使用して HashMap を同期させることができます。 LinkedHashMap はレコードの挿入順序を保存します。Iterator を使用して LinkedHashMap を走査する場合、最初に取得したレコードを最初に挿入する必要があります。
HashMap は次のステートメントを通じて同期できます:
Map m = Collections.synchronizeMap(hashMap);
よく使用されるいくつかのコレクションの効率の比較
以上がJava での HashMap トラバーサルと使用例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。