"=="运算符如何比较引用?表示"=="运算符的内部工作

gee*_*eks -2 java equals operator-keyword

"=="或Java中的等式运算符是Java编程语言提供的二元运算符,用于比较基元和对象.

"=="基于内存引用比较两个对象,因此"=="运算符只有在比较的两个对象引用表示完全相同的对象时才返回true,否则"=="将返回false.

我的问题是"=="运算符如何在java中比较对象?这里我们只关心引用是否引用对象.我们不是在谈论这种equals()方法.

chr*_*her 7

嗯,它实际上非常简单,可以使用C代码进行说明.在C中,有各种方法来访问值.使用*指示指针,&指示内存地址,并且这些都不是默认值.例如:

int *myValue; // A pointer to an integer value.
Run Code Online (Sandbox Code Playgroud)

现在,Java隐藏了这一点,但它没有改变这就是发生的事实.

Object myObject; // A pointer to an Object.
Run Code Online (Sandbox Code Playgroud)

==它的工作方式是因为编译器将获取操作数的实际值; 不是他们指出的价值观.当它解析这两个对象时,它会留下内存地址,这就是它所比较的​​内容.这就产生了一种错觉,即它正在检查它们是否是同一个对象.

当你输入..

int x = 5;
int y = 4;

if(x == y) { System.out.println("Do something"); }
Run Code Online (Sandbox Code Playgroud)

==被看出来了,xy与他们所取代的实际值,因此它成为..

if(5 == 4)
Run Code Online (Sandbox Code Playgroud)

哪个,任何值得盐的编译器都可以评估为..

if(false)
Run Code Online (Sandbox Code Playgroud)

现在让我们用Objects做同样的事情.

Object object = new Object(); 
Object object2 = new Object();
Run Code Online (Sandbox Code Playgroud)

现在我们已经声明了两个指向两个独立对象的指针.在实际的值object是内存地址,因为是object2,所以当我们比较他们..

if(object == object2)
Run Code Online (Sandbox Code Playgroud)

这会被他们的内存地址所取代..

if(92305204950249t00 == 94205924059204t924)
// Just random values indicating memory addresses
Run Code Online (Sandbox Code Playgroud)

他们被比较了.它们是不同的,所以它变成..

if(false)
Run Code Online (Sandbox Code Playgroud)

与完全相同的方式int.