如果两个对象共享相同的内存引用,它会在==
检查所有内容。那么为什么我在下面的代码中得到输出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
。有人可以清除我的怀疑吗?
答案 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 o2
,Double 13.0
。d2
指向Object o1
,Double 12.0
。因此,您可以看到d1
和d2
指向完全不同的对象。
如果使用原始double
,情况将是相同的,除非谈论对象和引用是不正确的,你将复制内存。
答案 2 :(得分:1)
我会尝试回答你的问题:
d2值为12.0,d1值为13.0。当您更改d1的值时,它会创建对不同对象的新引用。 d1和d2是对同一对象的引用,但现在它们引用了具有唯一值的不同对象。
同样从软件维护的角度来看,如果在更改不同的变量名称时所有对象都发生变化,则更难维护,因为您必须知道所有变量分配的位置并跟踪它们。
答案 3 :(得分:0)
在操作方面,存在从Double到double的隐式转换。 Integer和Float也是如此。 Double是一个为原始类型double添加功能的类。例如:您可以执行ArrayList但不能执行ArrayList。