我们知道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不同.使用对象引用,您无法更改引用的值,即它指向的对象.
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)
尝试Hashtable使用不可修改的地图包装你Collections.unmodifiableMap( MYHASH ).当您尝试更改地图中的某些内容时,这应该抛出异常,即添加或删除条目.(注意那MYHASH应该是类型Map<String, String>而不是 Hashtable<String, String>.)
关于final关键字:正如其他人已经说过的那样,这意味着你不能指定另一个Hashtable,MYHASH但地图本身仍然是可变的.要改变这一点,你必须用一些不可变的包装器包装它,就像UnmodifiableMap上面提到的那样.
| 归档时间: |
|
| 查看次数: |
33409 次 |
| 最近记录: |