如果两个相同的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?
HashMap
对String
个对象有什么特殊行为吗?如果没有,为什么可以使用两个“不同”字符串来放置和从哈希值中获取值?
答案 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只有一个字符串对象的副本