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

时间:2012-02-23 23:34:28

标签: java hashmap

如果两个相同的String实际上不相同,那么为什么我可以在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?

HashMapString个对象有什么特殊行为吗?如果没有,为什么可以使用两个“不同”字符串来放置和从哈希值中获取值?

6 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

  

如果两个相同的字符串实际上不相等

但他们是。它们在equals()方法下是相同的,这是在Map接口中为相等测试指定的技术。

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

但这不是假的!由于编译器的常量池,两者都引用相同的字符串。

答案 3 :(得分:2)

HashMap在内部比较密钥时,它使用equals()方法,而不是==。因此,对于密钥匹配,对象相等性很好,如果覆盖equals(),则不需要引用相等(如java.lang.String的情况。)

答案 4 :(得分:1)

  

System.out.println(s1 == s2); //应该是假的

不应该。 Java编译器可以优化并将两个字符串指向同一位置。

<强>更新

public class Test {

    public static void main(String... args) {
        String s1 = "abc";
        String s2 = "abc";

        System.out.println(s1 == s2);
    }

}

输出

javac Test.java
java Test
> true

答案 5 :(得分:-2)

我们应该首先回到基础。

计算机科学基础:

==比较内存地址(参考)

.equals比较存储在存储器地址中的值

java基础。整个jvm只有一个字符串对象的副本