在java中创建Hashtable作为final
Posted
技术标签:
【中文标题】在java中创建Hashtable作为final【英文标题】:Creating Hashtable as final in java 【发布时间】:2011-12-21 05:49:13 【问题描述】:我们知道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); ;
现在我将 MYHASH HashTable 声明为最终的。如果我尝试为此添加更多元素,则可以接受。
MYHASH.put("NEW DATA", 256);
现在“新数据”已添加到哈希表中。 我的问题是为什么它允许添加甚至声明为 final ???
【问题讨论】:
请注意,如果地图的内容是可变的(例如java.util.Date
或java.awt.Point
),那么它仍然是可变的。
【参考方案1】:
因为 final 标记的是引用,而不是对象。您不能将该参考点指向不同的哈希表。但是您可以对该对象执行任何操作,包括添加和删除内容。
int
的示例是原始类型,而不是引用。 Final 意味着您不能更改变量的值。因此,使用 int
您无法更改变量的值,例如使int
的值不同。使用对象引用,您无法更改引用的值,即它指向的对象。
【讨论】:
【参考方案2】:对于字段和变量,使用final
意味着它们只能被赋值一次。立即或稍后(例如在字段的构造函数中)。这并不意味着实际实例变得不可变。 Hashtable 是一种可以添加条目的数据结构,无论它是如何分配给某个变量的。只有 reference 是最终的。
【讨论】:
【参考方案3】:尝试使用Collections.unmodifiableMap( MYHASH )
将您的Hashtable
包裹在不可修改的地图中。当您尝试更改地图中的某些内容(即添加或删除条目)时,这应该会引发异常。 (请注意,MYHASH
的类型应为 Map<String, String>
而不是 Hashtable<String, String>
。)
关于final
关键字:正如其他人已经说过的那样,这意味着您不能将另一个Hashtable
分配给MYHASH
,但地图本身仍然是可变的。要改变这一点,你必须用一些不可变的包装器来包装它,比如上面提到的UnmodifiableMap
。
【讨论】:
【参考方案4】:只有引用是最终的,它的方法当然可以像非最终引用一样被调用。
使用Collections.unmodifiableMap(map)
使地图不可修改。
【讨论】:
【参考方案5】:正如乔所说,这是因为final
标记的是引用而不是对象。
但是,您可以使用Collections.unmodifiableMap
做您想做的事(请参阅here)
【讨论】:
【参考方案6】:您可以使用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);
【讨论】:
你得到我的 +1 是因为你显然没有让地图的可变版本在不经意间发生变异。本来希望保持不变的静态private
。使用Hashtable
也没有意义。
谢谢!为了与问题保持一致,我选择了Hashtable
,但我没有注意到private
。以上是关于在java中创建Hashtable作为final的主要内容,如果未能解决你的问题,请参考以下文章
为啥java代码中创建的Android Button()必须使用(this)作为上下文?
如何在 Netbeans 中创建 Java 项目,而不使用 Maven 作为默认值?