为什么此String HashMap无法通过* char *键获取正确的值

时间:2019-07-13 23:28:25

标签: java

我有此字符串到字符串映射,并且我试图将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中检索键?

2 个答案:

答案 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')键,因此会返回