为什么我可以将字符串用作HashMap中的键?

Tom*_*nal 5 java hashmap

如果两个String相同的s实际上不相同,那么为什么我可以在HashMap不使用相同String对象的情况下将字符串用作键?

String s1 = "Test";
String s2 = "Test";

System.out.println(s1 == s2); // should be false
System.out.println(s1.equals(s2)); // should be true

HashMap<String, String> map = new HashMap();
map.put(s1, "foo");
System.out.println(map.get(s2)); // should be "foo"--but why?
Run Code Online (Sandbox Code Playgroud)

是否HashMap有一些特殊行为String的对象?如果没有,为什么可以使用两个"不同"字符串来放置和获取哈希值?

SLa*_*aks 14

HashMap通过调用equals()和比较对象hashCode().
String覆盖这些方法以按值进行比较.


Ted*_*opp 5

通常,您可以使用String对象,因为HashMap使用equals()而不是==测试密钥相等性.