Treemapはnullのキーの値、nullのキーの値に関連しています。

6979 ワード

HashMapはnull値nullキーを保存できることを知っています。それならTreeMapは大丈夫ですか?  まず、null値を格納できるかどうかを見ます。コードは以下の通りです。
        TreeMap ts = new TreeMap<>();
        ts.put(" ", 1);
        ts.put(" ", null);
        System.out.println(ts.get(" "));
  • 1
  • ,
  • 4
  • 1
  • ,
  • 4
  • このように運行した結果は大丈夫です。正常にnullを出力できます。  じゃ、nullキーは?変更コードはこのようにしています。
            TreeMap ts = new TreeMap<>();
            ts.put(" ", 1);
            ts.put(" ", 2);
            ts.put(null, 3);
            System.out.println(ts.get(null));
  • 1
  • ,
  • 4
  • 5
  • 1
  • ,
  • 4
  • 5
  • Exception in thread「main」 Java.lang.Null PointerException  それならts.put(null、3);この行のプログラムは空のポインターに異常を報告しました。  まずはString類がComprableインターフェースを実現したことを明確にします。したがって、TreeMapはコンパレータに入る必要がありません。ここで空のポインターを申し込みましたが、データを預け入れる時に、String類のcompreToメソッドを呼び出すため、nullとなります。compreToメソッドを呼び出すと空のポインターが発生します。  では、put法の下の部分が分かったら、その保存nullキーの強制を実現するためにコンパレータに入ることができます。コードは以下の通りです
            TreeMap<String, Integer> ts = new TreeMap<>(new Comparator<String>() {
                public int compare(String s1, String s2) {      //     s1          s2         
                    if (s1 == null){
                        return 1;
                        }
                    else {
                        return s2.charAt(0) - s1.charAt(0);
                    }
                }
            });
            ts.put(" ", 1);
            ts.put(" ", 2);
            ts.put(null, 3);
    
  • 1
  • ,
  • 4
  • 5
  • ,
  • ,
  • 8
  • 9,
  • 10
  • 11
  • 1
  • ,
  • 4
  • 5
  • ,
  • ,
  • 8
  • 9,
  • 10
  • 11
  • TreeMapにコンパレータが入ってきて、putメソッドは優先的にコンパレータを呼び出すので、s 1==nullの時に1を強制的に返すと、nullキーを記憶することができます。しかし、このときはget(キー)の方法で値を取得することはできません。以下のようにキーペアを巡回して取得することができます。
            Set<Map.Entry<String, Integer>> s = ts.entrySet();
            for (Map.Entry<String, Integer> entry : s) {
                System.out.println(entry);
            }
  • 1
  • ,
  • 4
  • 1
  • ,
  • 4