在Java中创建Hashtable作为final

Sat*_*ish 37 java hashtable

我们知道java中"final"关键字的用途.在将变量声明为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);  }}; 
Run Code Online (Sandbox Code Playgroud)

现在我宣布MYHASH HashTable为最终版.如果我尝试添加更多元素,它接受.

MYHASH.put("NEW DATA",      256);
Run Code Online (Sandbox Code Playgroud)

现在,"NEW DATA"被添加到HashTable中.我的问题是为什么它允许添加甚至其声明为最终????

Joe*_*Joe 77

因为final标记了引用,而不是对象.您不能将该引用指向另一个哈希表.但是你可以对该对象做任何事情,包括添加和删除东西.

你的an的例子int是原始类型,而不是引用.最终意味着您无法更改变量的值.所以,用一个int你不能改变变量的值,例如使值变化int不同.使用对象引用,您无法更改引用的值,即它指向的对象.


Ing*_*gel 13

只有参考是最终的,它的方法当然可以被称为非最终参考.

使用Collections.unmodifiableMap(map)使地图不可修改.


Vla*_*lad 13

您可以使用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);    

    }

}
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 6

尝试Hashtable使用不可修改的地图包装你Collections.unmodifiableMap( MYHASH ).当您尝试更改地图中的某些内容时,这应该抛出异常,即添加或删除条目.(注意那MYHASH应该是类型Map<String, String>而不是 Hashtable<String, String>.)

关于final关键字:正如其他人已经说过的那样,这意味着你不能指定另一个Hashtable,MYHASH但地图本身仍然是可变的.要改变这一点,你必须用一些不可变的包装器包装它,就像UnmodifiableMap上面提到的那样.


Jef*_*ter 5

正如乔所说,这是因为final标记引用而不是对象。

但是,您可以随心所欲Collections.unmodifiableMap(请参阅此处