Java “如何”==&引用;操作员比较引用?是指“内部工作”==&引用;操作人员

Java “如何”==&引用;操作员比较引用?是指“内部工作”==&引用;操作人员,java,equals,operator-keyword,Java,Equals,Operator Keyword,“==”或Java中的相等运算符是Java编程语言提供的二进制运算符,用于比较原语和对象 “==”根据内存引用比较两个对象 我的问题是“==”操作符在java中如何比较对象?这里我们只关心引用是否引用对象。我们不是在讨论equals()方法。实际上,它非常简单,可以用C代码来说明。在C语言中,有多种访问值的方法。使用*表示指针,&表示内存地址,这两个值都不是默认值。例如: int *myValue; // A pointer to an integer value. 现在,Java对您隐藏了这

“==”或Java中的相等运算符是Java编程语言提供的二进制运算符,用于比较原语和对象

“==”根据内存引用比较两个对象


我的问题是“==”操作符在java中如何比较对象?这里我们只关心引用是否引用对象。我们不是在讨论
equals()
方法。

实际上,它非常简单,可以用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)
任何一个称职的编译器都可以计算出

if(false)
现在让我们对对象做同样的事情

Object object = new Object(); 
Object object2 = new Object();
现在我们已经声明了指向两个独立对象的两个指针。
object
的实际值是一个内存地址,正如
object2
一样,因此当我们比较它们时

if(object == object2)
这将替换为它们的内存地址

if(92305204950249t00 == 94205924059204t924)
// Just random values indicating memory addresses
并对它们进行了比较。他们是不同的,所以就成了

if(5 == 4)
if(false)
与使用
int

的方式完全相同,让我们使用以下代码:

final Object o1 = new Object();
final Object o2 = o1; // legal
o1 == o2; // true
JVM的任何实现都需要在第三行返回true:
o1
o2
是完全相同的引用。将
Object
替换为任何其他类,上述内容始终为真

至于原语,对于整数类型(包括
布尔型
),这很容易;对于浮点类型,这并不容易;例如,这是错误的:

Double.NaN == Double.NaN
这就是为什么Java有:

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

这是真的。

明显的反问题:你为什么在意?你是指内部吗?我假设你知道引用的意思,如果你知道引用是什么,那么你就有答案了。Thansk for replay,但是我想知道==运算符的内部工作是否对hashcode有效?不。两个不同的对象可以有相同的hashcode,因此它不能对hashcode有效。@christopher感谢replay我正在寻找这个答案。