【问题标题】:How are both of these variables the same?这两个变量如何相同?
【发布时间】:2014-03-06 17:21:32
【问题描述】:

为什么是这两个整数

Long num = new Long(21); 
long num2 = 21;

比较时返回 true (num==num2)

但是这个字符串

String word1 = "Hello";
String word2 = new String("Hello");

比较时返回 false (word1==word2)?

【问题讨论】:

  • 我无法改进 Rohit Jain 的回答,但我想指出另一件事:您说的是“这两个整数”。我没有看到两个整数;我看到两个变量。其中一个变量保存长值,另一个保存对象引用。变量、值、对象和对象引用都是不同的东西,只有了解它们的不同之处才能真正理解 Java。

标签: java string long-integer


【解决方案1】:

在第一种情况下,您将 Long 引用与 long 原始类型进行比较,在这种情况下,Long 引用会自动进行 unboxing conversion,比较是在两个原始 long 之间完成的,因此它们是平等的。这符合JLS §5.6.2 - Binary Numeric Promotion

而在第二种情况下,您正在比较两个不同的引用,都指向两个不同的对象,因此它们具有不同的值,并返回 false

【讨论】:

  • +1。给 OP 的注释:如果你已经完成了Long num2 = 21L(注意大写的“Long”和“21L”),那么num != num2。在这种情况下,您正在比较两个 Long 对象,并且这些对象的比较与任何其他对象一样:通过引用相等。
  • 我要指出,如果你想比较两个字符串是否相等,你应该使用word1.equals(word2) 而不是word1 == word2
【解决方案2】:

在您之前的示例中,num 被强制转换为 long,并且比较成功。

在第二种情况下,两个不同的对象具有不同的地址,因此是!=

【讨论】:

    【解决方案3】:

    因为在数值相等的情况下,JVM 会执行自动拆箱(即将Long 转换为long),因为== 的一个参数是long

    在第二种情况下,"Hello"new String("Hello") 是两个不同的对象。对于对象,== 只有在引用相同时才为真。

    【讨论】:

      【解决方案4】:

      第一种情况

      num 向下转换为 long 并按值 21 进行比较,因此返回 true。

      第二种情况

      java中的

      new操作符总是创建新对象,所以word2指向新对象,所以word1==word2返回false。

      【讨论】:

        猜你喜欢
        • 2022-07-19
        • 2018-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多