繁体   English   中英

为什么==对于Integer和String是不同的?

[英]Why == is different for Integer and String?

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:Integer等于vs. ==

摘自这篇文章:JVM正在缓存整数值。 ==仅适用于介于-128和127之间的数字。因此,在您的示例中,它不适用于500。

使用string1.equals(string2); //用于字符串值

而不是使用string1 == string2; //用于整数值

希望这可以帮助。

这个问题的答案应该有助于解释它: 如何正确比较Java中的两个整数?

你几乎回答了自己的问题。 “==”不仅比较字符串中的参考点,而且似乎用整数做同样的事情。

您指定“Hello”的方式没有堆分配。 相反,作为静态编译时常量的“Hello”将被外包到可执行文件的特定部分并被引用。 因此,两个引用都将指向相同的地址。

所以有Java String Pool,这里s1和s2实际上是相同的链接。 对于整数,也有池,但它只存在于Integers -127到128之间

所以,如果你有

Integer i1 = 100;

Integer i2 = 100;

那么i1 == i2将是真的

“==”始终比较值的内存位置或对象引用。 equals方法总是比较values.but equals也间接使用“==”运算符来比较值。 整数使用整数缓存来存储-128到+ 127之间的值。如果==运算符用于检查-128到127之间的任何值,则返回true。 除了这些值之外,它返回false。

在string中,如果string是这样初始化的

    String s1="abc"
    String s2="abc"

字符串s1和s2指向内存或字符串池中的相同位置。

如果字符串像这样初始化

    String s1=new String("abc"); 
    String s2=new String("abc");

字符串s1指向它包含的新位置字符串“abc”字符串s2指向它包含字符串“abc”的新位置,但s1的位置与s2的位置不同。在这种情况下,equals方法对字符串比较很有用。

有关其他信息,请参阅链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM