在java中创建哈希表作为final
正如我们所知,“final”关键字在java中的用途。在将变量声明为final时,我们必须初始化变量。比如“final int a=10;” 我们不能改变“a”的价值。但是,如果我们选择HashTable,就有可能添加一些值,甚至可以将HashTable声明为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
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);
}
}