web-dev-qa-db-ja.com

javaで最終的なハッシュテーブルを作成する

私たちが知っているように、Javaの「最終」キーワードの目的は。変数をfinalとして宣言しながら、変数を初期化する必要があります。 「final int a = 10;」のように、「a」の値を変更することはできません。しかし、HashTableを使用する場合、HashTableをfinalとして宣言することで値を追加することもできます。

例::

 private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() 
{{     put("foo",      1);     
       put("bar",      256);     
       put("data",     3);     
       put("moredata", 27);     
       put("hello",    32);     
       put("world",    65536);  }}; 

今、最終的にMYHASH HashTableを宣言しています。これにさらに要素を追加しようとすると、受け入れられます。

MYHASH.put("NEW DATA",      256);

これで、「新しいデータ」がHashTableに追加されます。私の質問は、なぜその宣言を最終として追加することができるのですか????

35
Sathish

Finalはオブジェクトではなく参照をマークするためです。その参照ポイントを別のハッシュテーブルに作成することはできません。ただし、オブジェクトの追加や削除など、そのオブジェクトに対しては何でもできます。

intの例は、参照ではなくプリミティブ型です。最終は、変数の値を変更できないことを意味します。したがって、intを使用すると、変数の値を変更できません。 intの値を変更します。オブジェクト参照では、参照の値、つまり参照するオブジェクトを変更できません。

75
Joe

参照のみが最終的なものであり、そのメソッドは、非最終参照の場合と同様に呼び出すことができます。

Collections.unmodifiableMap(map)を使用して、マップを変更不可にします。

13
Ingo Kegel

Collections.unmodifiableMap ハッシュテーブルの変更不可能なラッパーを取得します。

例:

import Java.util.*;
class Test{

    public static final Map<String,Integer> MYHASH;
    static{
        Hashtable<String,Integer> tmp = 
            new Hashtable<String,Integer>();
        tmp.put("A",65);
        tmp.put("C",67);
        MYHASH = Collections.unmodifiableMap(tmp);
    }

    public static void main(String[] args){

        System.out.println(MYHASH.get("A"));

        //this will throw
        //Java.lang.UnsupportedOperationException
        MYHASH.put("B",66);    

    }

}
12
Vlad

Collections.unmodifiableMap( MYHASH )を使用して、Hashtableを変更不可能なマップでラップしてみてください。マップ内の何かを変更しようとすると、つまり、エントリを追加または削除しようとすると、例外がスローされます。 (MYHASHMap<String, String>ではなくHashtable<String, String>型でなければなりません。)

finalキーワードに関して:他の人がすでに述べたように、別のHashtableMYHASHに割り当てることはできませんが、マップ自体はまだ変更可能であることを意味します。これを変更するには、上記のUnmodifiableMapのような不変のラッパーでラップする必要があります。

6
Thomas

ジョーが言ったように、これはfinalがオブジェクトではなく参照をマークするためです。

ただし、Collections.unmodifiableMapこちら を参照)

4
Jeff Foster

フィールドと変数の場合、finalを使用すると、それらを1回だけ割り当てることができます。すぐに、またはしばらくしてから(たとえば、フィールドのコンストラクターで)。これは、実際のインスタンスが不変になるという意味ではありません。ハッシュテーブルは、変数への割り当て方法に関係なく、エントリを追加できるデータ構造です。 参照のみが最終です。

0
G_H