怎么" =="运算符比较参考?是指" =="的内部工作。操作者

时间:2014-11-04 18:09:32

标签: java equals operator-keyword

“==”或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()方法。

2 个答案:

答案 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"); }

看到==xy被替换为实际值,因此它变为..

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:o1o2是完全相同的引用。将Object替换为其他任何类别,上述内容将永远为真。

对于基元,对于整数类型(这包括boolean),这很容易;对于浮点类型来说,这并不容易;例如,这是错误的:

Double.NaN == Double.NaN

这就是Java的原因:

Double.compare(Double.NaN, Double.NaN)

这是真的。