在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.Datejava.awt.Point),那么它仍然是可变的。 【参考方案1】:

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

int 的示例是原始类型,而不是引用。 Final 意味着您不能更改变量的值。因此,使用 int 您无法更改变量的值,例如使int 的值不同。使用对象引用,您无法更改引用的值,即它指向的对象。

【讨论】:

【参考方案2】:

对于字段和变量,使用final 意味着它们只能被赋值一次。立即或稍后(例如在字段的构造函数中)。这并不意味着实际实例变得不可变。 Hashtable 是一种可以添加条目的数据结构,无论它是如何分配给某个变量的。只有 reference 是最终的。

【讨论】:

【参考方案3】:

尝试使用Collections.unmodifiableMap( MYHASH ) 将您的Hashtable 包裹在不可修改的地图中。当您尝试更改地图中的某些内容(即添加或删除条目)时,这应该会引发异常。 (请注意,MYHASH 的类型应为 Map&lt;String, String&gt; 而不是 Hashtable&lt;String, String&gt;。)

关于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 作为默认值?

如何读取文本文件(逐行)并使用输出作为 nameS 在 java 中创建 .pdf 文件?

在 Java 中创建“逻辑异或”运算符

如何在 Java 中创建垂直选项卡?

从java在mysql中创建数据库