我正在写一个简单的程序,将一个数字转换成一个代表该数字的单词(13 =>"十三").
我意识到我可以用这样的常量String数组得到一些单词:
private static final String[] tensNames = {"", " ten", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety" };
...并使用索引访问它,但我想尝试使用这样的HashMap:
final HashMap tensNumberCOnversion= new HashMap();
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可以是常量吗?作为一个新手,还不完全清楚术语"常数","静态"和"最终"是如何相关的,以及究竟是什么使它成为一个常数.(单独静止?最后一个人?静态决赛一起?).
我尝试将其设为私有静态最终Hashmap,但IntelliJ给了我一个错误(修改符'私有'这里不允许...对于'静态'相同).
但是,它确实从我的终端编译没有错误.如果HashMap可以是常量,这是声明一个的正确方法吗?谢谢!
1> ZhekaKozlov..:
是的,它可以是一个常数.您应该HashMap
按如下方式声明您的实例:
class {
private static final HashMap 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");
}
}
但是,这只是一个不变的参考.虽然您无法重新分配tensNumberConversion
其他内容,但您仍可以在运行时更改地图的内容:
tensNumberCOnversion= new HashMap<>(); // won't compile
tensNumberConversion.put(9, "one"); // succeeds
如果您希望地图的内容也是常量,则应将其包装HashMap
到不可修改的地图中:
class {
private static final Map tensNumberCOnversion= initMap();
private static Map initMap() {
Map 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);
}
}
2> GhostCat say..:
这里有两个方面:
您有一个包含对地图的引用的变量.您只需将该变量声明为final ; 并且,您无法将变量更改为指向另一个参考.
但这并不妨碍您更改引用指向的对象的状态.因此,即使您拥有最终的Map对象,您仍然可以在该Map上调用put/remove/...方法.
所以,为了得到一个真正的"恒定"地图,你可以做到这一点:
首先,创建一个包含所有所需值的普通地图.
然后使用Collections.unmodifiableMap()
以创建无法再更改的地图.
需要注意的一件事是:你必须确保你没有泄漏对原始地图对象的引用,因为不可变地图只是该初始地图的包装.例如,你可以用一个小帮手方法做到这一点.
如果你问:是否有办法以特殊的"文字形式"(如数组)写下地图声明 - 没有.好吧,你可以改变那个辅助方法Object ...
作为参数; 然后你会经历这些参数,一个是数字,下一个是一个字符串,并使用它来填充地图.因此,您可以使用单个值序列调用该方法.但可能不值得努力......
快速更新:Java9添加了各种静态帮助器方法,允许您以某种方式"文字"方式写下地图,例如,请参见此处.
Collections.unmodifiableMap
3> eckes..:
只是BTW,使用Java 9 ,Map
界面中有静态方法来创建具有一些条目的不可变映射,例如:
Map m = Map.of("k1", "v1",
"K2", "v2");
或者如果需要超过10个条目:
import static java.util.Map.entry;
Map m = Map.ofEntries(
entry("k1", "v1"), entry("k2", "v2"), …);