是==运算符意味着原语比较

时间:2015-06-14 09:58:38

标签: java

如果两个对象共享相同的内存引用,它会在==检查所有内容。那么为什么我在下面的代码中得到输出false

public class A {
    public static void main(String args[]) {
        Double d1 = new Double(12.0);
        Double d2 = d1;
        d1 = d1 + 1.0;
        System.out.println(d1 == d2);
    }
}

这是由于自动装箱导致Double在行double中转换为d1 = d1 + 1.0==检查原始值吗?我很迷惑。我预计输出为true。有人可以清除我的怀疑吗?

4 个答案:

答案 0 :(得分:3)

您的代码比较12到13,因此结果不能是true。但是,即使您添加了零,也会得到false

由于自动装箱,您可以编写此表达式

d1=new Double(d1.doubleValue()+0.0);

使用此简短表格

d1=d1+0.0;

但实际上您正在创建Double类型的新对象,因此==会返回false

答案 1 :(得分:3)

我认为你的混淆源于这一行:

d1 = d1 + 1.0;

让我们从头开始。让我们调用对象dX和对象本身oX的引用。

开始写:

Double d1 = new Double(12.0);

因此,我们有一个引用d1,指向Object o1 Double 12.0

接下来你写:

Double d2 = d1;

现在我们有一个引用d1和一个引用d2,它们都指向Object o1 Double 12.0

接下来你写:

d1 = d1 + 1.0;

现在我们有了一个新对象o2,我们重新指定引用d1指向o2。永远不要忘记Java原始包装类型中始终不可变的不可变方法。因此,要更改其值,必须创建一个新的包装器。

所以最后你有

  • d1指向Object o2Double 13.0
  • d2指向Object o1Double 12.0

因此,您可以看到d1d2指向完全不同的对象。

如果使用原始double,情况将是相同的,除非谈论对象和引用是不正确的,你将复制内存。

答案 2 :(得分:1)

我会尝试回答你的问题:

d2值为12.0,d1值为13.0。当您更改d1的值时,它会创建对不同对象的新引用。 d1和d2是对同一对象的引用,但现在它们引用了具有唯一值的不同对象。

同样从软件维护的角度来看,如果在更改不同的变量名称时所有对象都发生变化,则更难维护,因为您必须知道所有变量分配的位置并跟踪它们。

答案 3 :(得分:0)

在操作方面,存在从Double到double的隐式转换。 Integer和Float也是如此。 Double是一个为原始类型double添加功能的类。例如:您可以执行ArrayList但不能执行ArrayList。