Java集合のMap

2922 ワード

Mapに保存されているのはキーのペアです。Mapはキーインデックスなので、keyは重複してはいけません。しかし、valueは繰り返すことができます。
Mapの常用実現類は、HashMap、hashtable、TreeMapです。TreeMapとTreeSetは似ています。SortedMapインターフェースを実現し、SortedMapはMapインターフェースから継承します。APIを見ると、HashMapとHashtableの方法は似ています。構造方法も同じです。私たちは以前、いくつかの似たような種類を見たことがあります。例えば、StringBuiderとStringBuffer、ARrayListとVector。hashMapとhashtableも同じです。HashMapは非スレッドで安全ですが、Hashtableはスレッドで安全です。しかし、それらの違いはこれらだけではない。
HashMapとHashtableの共通点:
1、これらはすべてMapインターフェースを実現しました。
2、これらはいずれもハッシュ・テーブルの実装である。
HashMapとHashtableの違い:
1、HashtableはDictorary類から継承されていますが、HashMapはAbstractMapから継承されています。
2、HashMapはnullをkeyまたはvalueとして記憶することを許可しますが、Hashtableは許可しません。
3、HashMapはhashtableのcontains方法を削除し、containsvalueとcontains Keyに変えました。contains方法は誤解を招きやすいからです。
4、最大の違いは、Hashtableはスレッドの安全であり、HashMapは非スレッドの安全であることです。
    public void testMap() {
        Map<String, String> info = new HashMap<String, String>();
        info.put("username", "Little");
        info.put("password", "hello, world");
        info.put("email", "[email protected]");
        info.put("phone", "110");
        info.put("nothing", "error");
        info.put(null, "the key is null"); // key null
        info.put("the value is null", null); // value null
        display(info);

        System.out.println("--- Remove 'error':" 
                + info.remove("error") + " ---");
        display(info);

        System.out.println("--- Remove 'nothing':'" 
                + info.remove("nothing") + "' ---");
        display(info);

        System.out.println("--- Replace 'password':'" 
                + info.put("password", "new, world") + "' ---");
        display(info);
    }

    public void display(Map map) {
        if (map == null) {
            System.out.println("[null]");
            return;
        }
        
        Set keys = map.keySet();
        for (Object key : keys) {
            System.out.println("<" + key + " = " + map.get(key) + ">");
        }
        System.out.println("Size: " + map.size());
    }
このコードはHashtableで実現することができますが、nullキーまたはnull値を預け入れたとき(コードに注釈が付いている2行)、いずれもNull PointerExceptionを抛り出します。Hashtableはnullキーまたはnull値を保存できないからです。
今まで、私達はすでに3つのJDKの中のハッシュ・テーブルの実現を勉強しました。HashSet、hashMap、hashtable。実際には、HashSetの下の階はhashMapで作られています。これは私たちが書いたMyStockと比較して理解できます。MyStock内部ではArayListを使ってデータを保存しています。操作もArayListに任せています。hashSetもこの原理です。HashMapに依頼するだけです。Setのもう一つの実装クラスTreeSetもこのような方式を使用しており、その下にTreeMapを使用している。この方法は対象に向けたパッケージ性を表している。