在java中创建哈希表作为final

在java中创建哈希表作为final,java,hashtable,Java,Hashtable,正如我们所知,“final”关键字在java中的用途。在将变量声明为final时,我们必须初始化变量。比如“final int a=10;” 我们不能改变“a”的价值。但是,如果我们选择HashTable,就有可能添加一些值,甚至可以将HashTable声明为final 例如: private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{ p

正如我们所知,“final”关键字在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);  }}; 
现在,“新数据”被添加到哈希表中。
我的问题是为什么它甚至允许添加它的声明为final???

,因为final标记的是引用,而不是对象。不能将该引用点指向其他哈希表。但您可以对该对象执行任何操作,包括添加和删除内容


您的
int
示例是基本类型,而不是引用。Final表示不能更改变量的值。因此,使用
int
不能更改变量的值,例如,使
int
的值不同。对于对象引用,您无法更改引用的值,即它指向的对象。

对于字段和变量,使用
final
意味着只能分配一次。立即或稍后(例如,在字段的构造函数中)。这并不意味着实际的实例是不可变的。哈希表是一种可以向其中添加条目的数据结构,而不管它是如何分配给某个变量的。只有引用是最终的。

尝试使用
集合将
哈希表
包装为不可修改的映射。不可修改映射(MYHASH)
。当您尝试更改映射中的某些内容(即添加或删除条目)时,这将引发异常。(注意,
MYHASH
应该是
Map
类型,而不是
Hashtable


关于
final
关键字:正如其他人已经说过的,这意味着您不能将另一个
Hashtable
分配给
MYHASH
,但映射本身仍然是可变的。要改变这一点,你必须用一些不可变的包装器来包装它,比如上面提到的
不可修改的映射。

只有引用是最终的,它的方法当然可以像非最终引用一样被调用


使用
Collections.unmodifiableMap(map)
使映射不可修改。

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

但是,您可以对集合执行所需的操作。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);    

    }

}
import java.util.*;
课堂测试{
公共静态最终映射MYHASH;
静止的{
哈希表tmp=
新哈希表();
tmp.put(“A”,65);
tmp.put(“C”,67);
MYHASH=Collections.unmodifiableMap(tmp);
}
公共静态void main(字符串[]args){
System.out.println(MYHASH.get(“A”);
//这个会扔
//java.lang.UnsupportedOperationException
MYHASH.put(“B”,66);
}
}

您获得my+1是因为您显然没有保留地图的可变版本,因为它可能会在无意中发生变异。希望保持不变的静态
私有
。使用
哈希表也没有意义。谢谢!为了与问题保持一致,我使用了
哈希表,但是我没有注意到
私有的
。注意,如果映射的内容是可变的(
java.util.Date
java.awt.Point
),那么它仍然是可变的。
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);    

    }

}