== 和 equals 之间的区别让我困惑了一段时间,直到我决定仔细研究一下。
他们中的许多人说要比较字符串,您应该使用equals 而不是==。希望在这个答案中我能说出不同之处。
回答这个问题的最佳方法是问自己几个问题。那么让我们开始吧:
以下程序的输出是什么:
String mango = "mango";
String mango2 = "mango";
System.out.println(mango != mango2);
System.out.println(mango == mango2);
如果你说,
false
true
我会说你是对,但是你为什么这么说?
如果你说输出是,
true
false
我会说你是错但我还是会问你,为什么你认为这是对的?
好的,让我们试着回答这个问题:
以下程序的输出是什么:
String mango = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango3);
System.out.println(mango == mango3);
现在如果你说,
false
true
我会说你是错但是为什么现在错了?
这个程序的正确输出是
true
false
请对比一下上面的程序,试着想一想。
好的。现在这可能会有所帮助(请阅读:print the address of object - 不可能,但我们仍然可以使用它。)
String mango = "mango";
String mango2 = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(mango3 != mango2);
System.out.println(mango3 == mango2);
// mango2 = "mang";
System.out.println(mango+" "+ mango2);
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(System.identityHashCode(mango));
System.out.println(System.identityHashCode(mango2));
System.out.println(System.identityHashCode(mango3));
你能不能试着想想上面代码中最后三行的输出:
对我来说,ideone 将其打印出来 (you can check the code here):
false
true
true
false
mango mango
false
true
17225372
17225372
5433634
哦!现在你看到 identityHashCode(mango) 等于 identityHashCode(mango2) 但它不等于 identityHashCode(mango3)
即使所有字符串变量 - mango、mango2 和 mango3 - 具有 相同 值,即“mango”,identityHashCode() 仍然不一样。
现在尝试取消注释这行 // mango2 = "mang"; 并再次运行它,这次您将看到所有三个 identityHashCode() 都不同。
嗯,这是一个有用的提示
我们知道如果hashcode(x)=N 和hashcode(y)=N => x is equal to y
我不确定 java 在内部是如何工作的,但我认为这就是我所说的情况:
mango = "mango";
java 创建了一个字符串"mango",它被变量mango 指向(引用) 类似这样的东西
mango ----> "mango"
现在在我说的下一行:
mango2 = "mango";
它实际上重用了相同的字符串"mango",看起来像这样
mango ----> "mango" <---- mango2
mango 和 mango2 都指向同一个引用
现在当我说
mango3 = new String("mango")
它实际上为“mango”创建了一个全新的引用(字符串)。看起来像这样,
mango -----> "mango" <------ mango2
mango3 ------> "mango"
这就是为什么当我输出mango == mango2 的值时,它输出了true。当我输出mango3 == mango2 的值时,它输出false(即使值相同)。
当你取消注释// mango2 = "mang";
它实际上创建了一个字符串“mang”,它把我们的图表变成了这样:
mango ---->"mango"
mango2 ----> "mang"
mango3 -----> "mango"
这就是为什么每个人的identityHashCode都不一样。
希望这对你们有帮助。
实际上,我想生成一个 == 失败且 equals() 通过的测试用例。
如果我错了,请随时发表评论并告诉我。