main(){
Integer i1 = 500;
Integer i2 = 500;
System.out.println(i1 == i2); // O/P is "**false**"
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2); // O/P is "**true**"
} // End of main.
我无法弄清楚为什么输出不同。据我所知,s1,s2 将指向堆上的同一对象。所以它们的参考地址是相同的。同样,我认为整数也是一样的。但事实并非如此。为什么不同?
这里已经回答了: java:整数等于 vs. ==
摘自这篇文章:JVM 正在缓存整数值。 == 仅适用于 -128 到 127 之间的数字。因此,在您的示例中,它不适用于 500。
使用 string1.equals(string2);
//用于字符串值
而不是使用 string1 == string2;
//用于整数值
希望这有帮助。
这个问题的答案应该有助于解释它:如何在 Java 中正确比较两个整数?
你几乎回答了你自己的问题。 "=="不仅比较字符串中的参考点,而且似乎对整数做同样的事情。
您指定"Hello"的方式不进行堆分配。相反,作为静态编译时常量的"Hello"将被外包到可执行文件的特定部分并被引用。因此,两个引用将指向同一地址。
所以有Java字符串池,这里的s1和s2实际上是相同的链接。在整数的情况下,也有池,但它只存在于整数 -127 到 128
所以如果你有
Integer i1 = 100;
Integer i2 = 100;
那么 i1==i2 将为真
"==" 总是比较值的内存位置或对象引用。等于方法始终比较值。但等于也间接使用"=="运算符来比较值。整数使用整数缓存来存储从 -128 到 +127 的值。如果使用 == 运算符检查 -128 到 127 之间的任何值,则返回 true。对于这些值以外的值,它返回 false 。
在字符串中,如果字符串像这样初始化
String s1="abc"
String s2="abc"
字符串 s1 和 s2 指向内存或字符串池中的同一位置。
如果字符串像这样初始化
String s1=new String("abc");
String s2=new String("abc");
字符串 s1 指向它包含字符串"abc"的新位置字符串 s2 指向它包含字符串"abc"的新位置,但 s1 的位置与 s2 的位置不同。在这种情况下,等于方法对于字符串比较很有用。
有关其他信息,请参阅链接