在java中创建哈希表作为最终版本

2022-08-31 17:44:09

正如我们所知,Java中“最终”关键字的目的。在将变量声明为 final 时,我们必须初始化该变量。就像“final int a=10;”我们不能改变“a”的值。但是,如果我们选择HashTable,即使将HashTable声明为最终值,它也可以增加一些价值。

例::

 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);

现在,“新数据”被添加到哈希表中。我的问题是,为什么它甚至允许添加其声明为最终状态????


答案 1

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

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


答案 2

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

    }

}