【问题标题】:Why == is different for Integer and String?为什么 == 对于 Integer 和 String 不同?
【发布时间】:2012-08-05 13:55:18
【问题描述】:
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 也是一样的。但事实并非如此。为什么不一样?

【问题讨论】:

  • 为什么你认为“s1,s2会指向堆上的同一个对象”?
  • 答案可能重复:stackoverflow.com/questions/3637936/java-integer-equals-vsstackoverflow.com/a/3637974/227755The JVM is caching Integer values. == only works for numbers between -128 and 127
  • @Tichodroma B'coz s1, s2 声明时没有使用 new 关键字。所以对 s1, s1; 都会给出相同的参考;
  • @pwned 是的,非常感谢。我知道。但是你还能告诉我为什么会这样吗?
  • @Amarnath 你问为什么JVM只缓存字节大小的整数?我在你的问题中没有看到任何迹象。如果这是您首先想问的问题,我建议您在获得更多答案之前修改问题。

标签: java


【解决方案1】:

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

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

【讨论】:

  • 尝试-XX:+AggressiveOpts 和类似选项,500 可能会起作用。 -129 永远不会工作。
  • 取决于你如何定义“工作”:) 我的建议是根本不要这样做
  • 附带说明,它在这里适用于字符串,因为您在代码中使用了字符串文字,最终会被实习,这意味着两个变量将指向同一个字符串实例.
【解决方案2】:

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

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    这个问题的答案应该有助于解释它: How to properly compare two Integers in Java?

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 同意。但是整数是什么情况?
      • 对于 Integer,情况正好相反(在上面提到的 -127 - 128 缓存范围之外):您创建两个具有相同值但在内存中位置不同的独立 Integer 对象 i1 和 i2。因此,== 将回答“假”,但 .Equals() 将回答“真”。
      【解决方案5】:

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

      如果你有

      Integer i1 = 100;
      
      Integer i2 = 100;
      

      那么 i1==i2 就会为真

      【讨论】:

      • 是的,我知道在两个 Integer 对象值均
      • 同样的事情,PermGen 中有一个池来存储这样的整数。
      【解决方案6】:

      "==" 总是比较值的内存位置或对象引用。 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 方法对字符串比较很有用。

      请参阅link 了解更多信息

      【讨论】:

        猜你喜欢
        • 2021-04-18
        • 2012-02-16
        • 2019-02-23
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 2019-05-05
        相关资源
        最近更新 更多