“==”或Java中的等于运算符是Java编程语言提供的二元运算符,用于比较基元和对象。
“==”根据内存引用so the "==" operator will return true only if the two object references it is comparing represent exactly same object, otherwise "==" will return false比较两个对象。
我的问题是“==”运算符如何在java中用于比较对象?这里我们只关心引用是否引用对象。我们不是在讨论equals()
方法。
答案 0 :(得分:7)
嗯,它实际上非常简单,可以使用C代码进行说明。在C中,有各种方法来访问值。使用*
表示指针,&
表示内存地址,这些都不是默认值。例如:
int *myValue; // A pointer to an integer value.
现在,Java隐藏了这一点,但它并没有改变这种情况发生的事实。
Object myObject; // A pointer to an Object.
==
按照它的方式工作,因为编译器将获取操作数的实际值;不是他们指出的价值观。当它解析这两个对象时,它会留下内存地址,这就是它所比较的内容。这就产生了一种错觉,即它正在检查它们是否是同一个对象。
示例强>
当您输入..
int x = 5;
int y = 4;
if(x == y) { System.out.println("Do something"); }
看到==
,x
和y
被替换为实际值,因此它变为..
if(5 == 4)
其中,任何值得盐的编译器都可以评估为..
if(false)
现在让我们用Objects做同样的事情。
Object object = new Object();
Object object2 = new Object();
现在我们已经声明了两个指向两个独立对象的指针。 object
的实际值是一个内存地址,object2
也是如此,所以当我们比较它们时。
if(object == object2)
这会被他们的内存地址所取代..
if(92305204950249t00 == 94205924059204t924)
// Just random values indicating memory addresses
他们被比较了。它们是不同的,所以它变成了......
if(false)
与int
完全相同。
答案 1 :(得分:1)
让我们有这个代码:
final Object o1 = new Object();
final Object o2 = o1; // legal
o1 == o2; // true
JVM的任何实现都需要在第三行返回true:o1
和o2
是完全相同的引用。将Object
替换为其他任何类别,上述内容将永远为真。
对于基元,对于整数类型(这包括boolean
),这很容易;对于浮点类型来说,这并不容易;例如,这是错误的:
Double.NaN == Double.NaN
这就是Java的原因:
Double.compare(Double.NaN, Double.NaN)
这是真的。