Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,我可以声明HashMap常量吗?_Java_Hashmap_Constants - Fatal编程技术网

在Java中,我可以声明HashMap常量吗?

在Java中,我可以声明HashMap常量吗?,java,hashmap,constants,Java,Hashmap,Constants,我正在编写一个简单的程序,将一个数字转换为表示该数字的单词(13=>“十三”) 我意识到我可以用一个常量字符串数组得到一些单词,如下所示: private static final String[] tensNames = {"", " ten", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety" }; final HashMap<Integer, String>

我正在编写一个简单的程序,将一个数字转换为表示该数字的单词(13=>“十三”)

我意识到我可以用一个常量字符串数组得到一些单词,如下所示:

private static final String[] tensNames = {"", " ten", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety" };
final HashMap<Integer, String> tensNumberConversion = new HashMap<Integer, String>();
    tensNumberConversion.put(2, "twenty");
    tensNumberConversion.put(3, "thirty");
    tensNumberConversion.put(4, "forty");
    tensNumberConversion.put(5, "fifty");
    tensNumberConversion.put(6, "sixty");
    tensNumberConversion.put(7, "seventy");
    tensNumberConversion.put(8, "eighty");
    tensNumberConversion.put(9, "ninety");
…并使用索引访问它,但我想使用如下哈希映射进行尝试:

private static final String[] tensNames = {"", " ten", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety" };
final HashMap<Integer, String> tensNumberConversion = new HashMap<Integer, String>();
    tensNumberConversion.put(2, "twenty");
    tensNumberConversion.put(3, "thirty");
    tensNumberConversion.put(4, "forty");
    tensNumberConversion.put(5, "fifty");
    tensNumberConversion.put(6, "sixty");
    tensNumberConversion.put(7, "seventy");
    tensNumberConversion.put(8, "eighty");
    tensNumberConversion.put(9, "ninety");
final HashMap tensNumberConversion=new HashMap();
时态数字转换。put(2,“二十”);
时态数字转换。put(3,“三十”);
时态数字转换(4,“40”);
时态数字转换(5,“50”);
时态数字转换(6,“六十”);
时态数字转换(7,“70”);
时态数字转换(8,“80”);
张量数字转换(9,“90”);
老师教我做这些常数。HashMap可以是常量吗?作为一个新手,我们并不完全清楚“常量”、“静态”和“最终”这两个术语之间的关系,也不清楚到底是什么构成了常量。(单独静态?单独最终?一起静态最终?)

我尝试将其设置为私有静态最终Hashmap,但IntelliJ给了我一个错误(这里不允许使用修饰符“private”…与“static”相同)


但是,它确实从我的终端编译,没有错误。如果HashMap可以是常量,那么这是声明常量的正确方法吗?谢谢

是的,它可以是一个常数。您应该声明
HashMap
实例,如下所示:

class <class name> {
    private static final HashMap<Integer, String> tensNumberConversion = new HashMap<>();

    static {
        tensNumberConversion.put(2, "twenty");
        tensNumberConversion.put(3, "thirty");
        tensNumberConversion.put(4, "forty");
        tensNumberConversion.put(5, "fifty");
        tensNumberConversion.put(6, "sixty");
        tensNumberConversion.put(7, "seventy");
        tensNumberConversion.put(8, "eighty");
        tensNumberConversion.put(9, "ninety");
    }
}
如果希望映射的内容也是常量,则应将
HashMap
包装成不可修改的映射:

class <class name> {
    private static final Map<Integer, String> tensNumberConversion = initMap();

    private static Map<Integer, String> initMap() {
        Map<Integer, String> map = new HashMap<>();
        map.put(2, "twenty");
        map.put(3, "thirty");
        map.put(4, "forty");
        map.put(5, "fifty");
        map.put(6, "sixty");
        map.put(7, "seventy");
        map.put(8, "eighty");
        map.put(9, "ninety");
        return Collections.unmodifiableMap(map);
    }
}
类{
私有静态最终映射tensNumberConversion=initMap();
私有静态映射initMap(){
Map Map=newhashmap();
地图放置(2,“20”);
地图放置(3,“30”);
地图放置(4,“40”);
地图。放置(5,“50”);
地图放置(6,“六十”);
地图放置(7,“70”);
地图放置(8,“80”);
地图放置(9,“90”);

返回集合。不可修改映射(map); } }
这里有两个方面:

  • 您有一个保存映射引用的变量。您只需声明该变量为最终变量;瞧,你不能改变变量指向另一个引用
  • 但这并不妨碍您更改引用所指向的对象的状态。因此,即使您有一个最终的Map对象,您仍然可以调用put/remove/。。。方法在该地图上
所以,为了得到一个真正的“常数”图,你需要这样做:

首先,创建一个包含所有所需值的普通贴图


然后使用集合.unmodifiableMap()创建一个不能再更改的映射

需要注意的一点是:您必须确保没有泄漏对原始映射对象的引用,因为不可变映射只是初始映射的包装。例如,您可以在一个小助手方法中实现这一点

如果你问:有没有一种方法可以用一种特殊的“文字形式”(比如数组)写下映射声明?没有。好的,您可以更改helper方法,将
对象…
作为参数;然后你会检查这些参数,一个是数字,下一个是字符串,然后用它来填充地图。因此,您可以使用单个值序列调用该方法。但可能不值得付出努力


快速更新:Java9添加了各种静态帮助器方法,允许您以某种“文字”方式写下映射,例如,请参见。

顺便说一句,使用Java 9可以创建包含一些条目的不可变映射,如:

Map<String,String> m = Map.of("k1", "v1",
                              "K2", "v2");
Map m=Map.of(“k1”、“v1”,
“K2”、“v2”);
或者如果需要10个以上的条目:

import static java.util.Map.entry;
Map<String, String> m = Map.ofEntries(
    entry("k1", "v1"), entry("k2", "v2"), …);
导入静态java.util.Map.entry;
地图m=入口地图(
条目(“k1”、“v1”)、条目(“k2”、“v2”)、;

您可以使用继承从HashMap继承一个新类,然后重写HashMap.put()方法以显示一些适当的失败消息,而不是使用组合来实现常量HashMap

classmymap扩展了java.util.HashMap{
@覆盖
公共V put(K键,V值){
System.out.println(“不支持操作”);
返回null;
}
}


请注意,这不是唯一的方法,而是许多可能的方法中的一种,我不知何故错过了直接初始化HashMap的最简单形式

private static final Map<Integer, String> tensNumberConversion_internal = new HashMap<Integer, String>()
{
    {
        put(2, "twenty");
        put(3, "thirty");
        put(4, "forty");
        put(5, "fifty");
        put(6, "sixty");
        put(7, "seventy");
        put(8, "eighty");
        put(9, "ninety");
    };
};

当然,它们必须按此顺序创建;)

它可以是一个常数,你在哪里声明你的
HashMap
?可能的重复根据我所看到的,我在5月12日接受了你的答案。这与您看到的有所不同吗?Collections.UnmodifiableMap现在好多了。但这基本上就是map返回的功能-除了它抛出而不是假装工作-所有修改方法抛出UnsupportedOperationException。我不会称之为“最简单”的形式,双括号初始化技巧是一个相当严重的问题:无论如何,map.of或map.of entry将维持秩序?我认为它只保证用于SortedMap实现和LinkedHashMap。Map.of特别提到迭代顺序未指定。