在Java中,我可以声明HashMap常量吗?
我正在编写一个简单的程序,将一个数字转换为表示该数字的单词(13=>“十三”) 我意识到我可以用一个常量字符串数组得到一些单词,如下所示:在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>
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特别提到迭代顺序未指定。