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将指向堆上的同一个对象。所以他们的参考地址是一样的。同样地,我认为整数也是一样的。但事实并非如此。为什么会有所不同?
答案 0 :(得分:8)
这里已经回答:java: Integer equals vs. ==
从这篇文章中获取:JVM正在缓存整数值。 ==仅适用于介于-128和127之间的数字。因此,在您的示例中,它不适用于500。
答案 1 :(得分:0)
使用string1.equals(string2);
//用于字符串值
而不是使用string1 == string2;
//用于整数值
希望这有帮助。
答案 2 :(得分:0)
这个问题的答案应该有助于解释它: How to properly compare two Integers in Java?
你几乎回答了自己的问题。 " =="不仅要比较字符串中的参考点,而且似乎用整数做同样的事情。
答案 3 :(得分:0)
您指定“Hello”的方式没有堆分配。相反,作为静态编译时常量的“Hello”将被外包到可执行文件的特定部分并被引用。因此,两个引用都将指向相同的地址。
答案 4 :(得分:0)
所以有Java String Pool,这里s1和s2实际上是相同的链接。 在整数的情况下,还有池,但它仅存在于整数-127到128
所以,如果你有
Integer i1 = 100;
Integer i2 = 100;
然后i1 == i2将是真的
答案 5 :(得分:0)
“==”始终比较值的内存位置或对象引用。 equals方法总是比较values.but equals也间接使用“==”运算符来比较值。整数使用整数缓存来存储-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的位置不同。在这种情况下,equals方法对字符串比较很有用。
请参阅link以获取更多信息