2
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 将指向堆上的同一个对象。所以它们的参考地址是相同的。同样,我认为 Integer 也是一样的。但事实并非如此。为什么不一样?

4

6 回答 6

8

这里已经回答了:java: Integer equals vs. ==

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

于 2012-08-08T12:48:14.523 回答
0

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

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

于 2012-08-08T12:48:09.443 回答
0

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

于 2012-08-08T12:48:49.470 回答
0

所以有 Java 字符串池,这里 s1 和 s2 实际上是相同的链接。在整数的情况下,也有池,但它只存在于整数 -127 到 128

所以如果你有

Integer i1 = 100;

Integer i2 = 100;

那么 i1==i2 将是真的

于 2012-08-08T12:49:19.703 回答
0

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

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

希望这可以帮助。

于 2012-08-08T12:46:44.373 回答
0

“==”总是比较值的内存位置或对象引用。equals 方法总是比较值。但 equals 也间接使用“==”运算符来比较值。Integer 使用 Integer 缓存来存储从 -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 方法可用于字符串比较。

请参阅 链接以获取更多信息

于 2016-07-28T06:30:40.453 回答