JAvaベースのいくつかのMapの違い

4796 ワード

現在のプロジェクトでLinkedHashMapが使われているので、あまり詳しくないのでネットで検索してみました.import   java.util.HashMap; import   java.util.Iterator; import   java.util.LinkedHashMap; import   java.util.Map; public   class   TestLinkedHashMap {
     public   static   void   main(String args[])    {     System.out.println( "*************************LinkedHashMap*************" );     Map<Integer,String> map = new   LinkedHashMap<Integer,String>();     map.put( 6 , "apple" );     map.put( 3 , "banana" );     map.put( 2 , "pear" );          for   (Iterator it =  map.keySet().iterator();it.hasNext();)     {      Object key = it.next();      System.out.println( key+ "=" + map.get(key));     }          System.out.println( "*************************HashMap*************" );     Map<Integer,String> map1 = new    HashMap<Integer,String>();     map1.put( 6 , "apple" );     map1.put( 3 , "banana" );     map1.put( 2 , "pear" );          for   (Iterator it =  map1.keySet().iterator();it.hasNext();)     {      Object key = it.next();      System.out.println( key+ "=" + map1.get(key));     }    } }
 
実行結果は次のとおりです.
*************************LinkedHashMap************* 6=apple 3=banana 2=pear *************************HashMap************************** 2=pear 6=apple 3=banana
分析:LinkedHashmapの特徴はputが入る対象の位置は変化していないが、HashMapは変化する.
再普及の下:
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で巡回すると,得られた記録は順序付けされている.