我有此字符串到字符串映射,并且我试图将char
作为键传递
Map<String, String> phone = new HashMap<String, String>() {{
put("2", "abc");
put("3", "def");
put("4", "ghi");
put("5", "jkl");
put("6", "mno");
put("7", "pqrs");
put("8", "tuv");
put("9", "wxyz");
}};
String letterList = phone.get('2'); //null
String letterList = phone.get(String.valueOf('2')); //it works
为什么第一种情况不起作用?据我了解,char
可以隐式转换为字符串“ 2”,并且HashMap使用equals()
比较键,以便它应该在map中检索键?
答案 0 :(得分:5)
为什么第一种情况不起作用?以我的理解,char可以隐式转换为字符串“ 2”
您的理解不正确。 char
将不隐式转换为String
。如果您查看文档,将看到此方法get(Object key)
。我不知道为什么它不是get(K key)
。但是,这说明了为什么第一个示例可以编译而没有任何错误:char
常量自动装箱到Character
对象中。由于值Character
的{{1}}不是您的'2'
中的键,因此Map
返回get()
。
答案 1 :(得分:2)
java.util.Map
仅将对象用作键,因此每当您执行map.get('c')
时,由于c是一个字符,编译器将执行自动装箱操作,将char c原语解析为Character
对象(而不是String)。你以为)
因此,最后编译器将解析以下内容:
map.get('2')
变成> map.get(Character.valueOf('2'))
由于地图中不存在Character.valueOf('2')
键,因此会返回