JavaではどのようにHashMapを使うか、それともTreeMapを使うかを決めますか?


HashMap簡単なまとめ:
1、HashMapはチェーン配列(チェーンテーブルを格納する配列)であり、クエリ速度を実現することができ、かつ迅速にkeyに対応するvalueを取得することができる。
2、照会速度の影響要因は容量と負荷因子があり、容量が大きい負荷因子は小さいが、照会速度は速いが、無駄な空間がある。
3、配列のindex値は(keyキーワード、hashcodeはkeyのハッシュ値、len配列の大きさ)である:hashcode%lenの値は決定して、容量が大きい負荷係数が小さいとindexは同じ確率で、チェーン長が小さいと照会速度が速く、逆にindexの同じ確率の大きいチェーンテーブルは比較的に長い照会速度が遅い。
4、HashMapおよびそのサブクラスにとって、彼らはhashアルゴリズムを用いてセットの中の要素の記憶位置を決定し、HashMapを初期化すると、システムはcapacityという長さのEnttry配列を作成します。この配列には元素を格納できる位置を桶といいます。各桶にはその指定された索引があります。システムは、インデックスに従って、バケツに記憶されている要素に素早くアクセスすることができる。
5、いつでもHashMapの各バケツには一つの要素しか記憶されていません。Entryオブジェクトは次のEntryを指す参照変数を含むことができるので、HashMapのバケットの中に一つのEntryしかないかもしれませんが、このEntryは他のEntryを指すので、Entryチェーンを形成します。
6、上のソースコードによって、HashMapは下の階でkey_を発見しました。valueは一つの全体として処理します。この全体はEntryオブジェクトです。システムがHashMapのkey_を記憶すると決めた時に。valueは、Entryの中のvalueを全く考慮していません。keyのhash値によって、各Entryの格納位置を決定します。
紹介する
TreeMap<K,V>のKey値はjava.lang.Compparableを実現することを要求しています。だから、反復の時、TreeMapはデフォルトでKey値の昇順に並べられています。TreeMapの実現は、赤黒いツリー構造に基づいている。キーを自然の順番またはカスタムの順序で巡回するのに適しています。
HashMap<K,V>のKey値はハッシュhashCode()を実現し、分布はハッシュ、均一で、順序付けをサポートしない。データ構造は主にバレル(配列)、チェーンまたはマホガニーです。Mapに要素を挿入、削除、位置決めするのに適しています。
結論
順序付けの結果が必要なら、TreeMapを使うべきです。また、HashMapはより良い性能を持っていますので、順序付けが必要でない場合が多いです。HashMapを使います。
広く開拓する
1、HashMapとTreeMapの実現
  • hashMap:ハッシュ・テーブルに基づいて実施される。hashMapを使用して追加を要求するキークラスは、hashCode()とequals()を明確に定義し、hashCode()とequals()を書き換えることができます。HashMap空間の使用を最適化するために、初期容量と負荷係数を調整することができます。
  • hashMap():空きハッシュ映像
  • を構築する。
  • hashMap(Map m):ハッシュ映像を構築し、映像mのマッピングをすべて追加する
  • HashMap(int initial Capacity):特定の容量の空きを持つハッシュ映像
  • を構築する。
  • HashMap(int initial Capacity、floadFactor):特定の容量とローディング係数を有する空のハッシュ映像
  • を構築する。
    TreeMap:赤黒いツリーに基づいて実現します。TreeMapは、ツリーが常に平衡状態にあるので、調整オプションがありません。
  • TreeMap():空き映像ツリーを構築する
  • TreeMap(Map m):イメージツリーを構築し、イメージmのすべての要素を追加する
  • TreeMap(Comprator c):イメージツリーを構築し、特定のコンパレータを使用してキーワードを並べ替える
  • TreeMap(SortedMap):イメージツリーを構築し、イメージツリー内のすべてのマッピングを追加し、順序映像sと同じコンパレータを使用して並べ替え
  • を行う。
    2、HashMapとTreeMapは非スレッドセキュリティです。
    HashMapはAbstractMapの抽象類を継承し、TreeMapはSortedMapインターフェースから継承しています。
    AbstractMap抽象クラス:equals()およびhashCode()方法をカバーして、2つの等しいマッピングが同じハッシュコードに戻ることを保証する。二つのマッピングサイズが同じで、同じキーを含み、各キーがこの二つのマッピングで対応する値が同じであれば、この二つのマッピングは等しいです。マッピングされたハッシュコードは、各要素がMap.Entryインターフェースの1つの実装であるマッピング要素のハッシュコードの総和である。したがって、マッピング内部順序にかかわらず、2つの等しいマッピングは同じハッシュコードを報告する。
    SortedMapインターフェース:キーの順序を維持するために使用されます。SortedMapインターフェースは、2つのエンドポイントを含む映像のビュー(サブセット)のためのアクセス方法を提供する。並べ替えがマッピングに作用するキーの他に、SortedMapを処理するのはSortedSetと同じです。SortedMap実装クラスに追加する要素は、Comprableインターフェースを実現しなければなりません。そうでなければ、Compratorインターフェースの実装を提供する必要があります。TreeMapクラスは唯一の実装です。
    3、TreeMapのデフォルトは昇順で並べられていますが、どのように彼を降順させますか?
    コンパレータをカスタマイズして実現します。
    コンパレータクラスを定義し、Compratorインターフェースを実現し、compare方法を書き換え、二つのパラメータがあります。この二つのパラメータはcompreToを呼び出して比較します。
  • パラメータ文字列がこの文字列に等しい場合、0値を返します。
  • この文字列が文字列パラメータより小さい場合、0より小さい値を返します。
  • この文字列が文字列パラメータより大きい場合、0より大きい値を返します。
  • コンパレータをカスタマイズすると、戻る時に負の記号を追加して、比較の結果を逆の形で返します。コードは以下の通りです。
    
    static class MyComparator implements Comparator{
     @Override
     public int compare(Object o1, Object o2) {
      // TODO Auto-generated method stub
      String param1 = (String)o1;
      String param2 = (String)o2;
      return -param1.compareTo(param2);
     } 
    }
    その後、MyCompratorクラスを通じてコンパレータの一例を初期化し、パラメータとしてTreeMapの構造方法に送る。
    
    MyComparator comparator = new MyComparator();
    Map<String,String> map = new TreeMap<String,String>(comparator);
    このように、私達はカスタムコンパレータを使って降順を実現することができます。
    
    public class MapTest {
     public static void main(String[] args) {
      //         
      MyComparator comparator = new MyComparator();
      //     map  
      Map<String,String> map = new TreeMap<String,String>(comparator);
      //    
      map.put("a", "a");
      map.put("b", "b");
      map.put("f", "f");
      map.put("d", "d");
      map.put("c", "c");
      map.put("g", "g");
      //    
      Iterator iterator = map.keySet().iterator();
      while(iterator.hasNext()){
       String key = (String)iterator.next();
       System.out.println(map.get(key));
      }
     }
     static class MyComparator implements Comparator{
      @Override
      public int compare(Object o1, Object o2) {
       // TODO Auto-generated method stub
       String param1 = (String)o1;
       String param2 = (String)o2;
       return -param1.compareTo(param2);
      }
     }
    }
    締め括りをつける
    以上述べたように、JavaではどのようにHashMapを使うか、それともTreeMapを使うかを決めるかを紹介しました。皆さんに何かお聞きしたいことがあれば、メッセージをください。ここでも私たちのサイトを応援してくれてありがとうございます。
    本文があなたのためになると思ったら、転載を歓迎します。出所を明記してください。ありがとうございます。