【问题标题】:How "==" operator compare references? mean internal working of "==" operator“==”运算符如何比较引用?表示“==”运算符的内部工作
【发布时间】:2014-11-04 18:09:31
【问题描述】:

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

【问题讨论】:

  • 明显的反问:你为什么关心?
  • 你是指内部吗?
  • 我假设你知道参考是什么意思,如果你知道参考是什么,那么你就有答案了。
  • 感谢重播,但我想知道 == 运算符的内部工作是否适用于哈希码?
  • 没有。两个不同的对象可以有相同的hashcode,所以它不能作用于hashcode。

标签: java equals operator-keyword


【解决方案1】:

嗯,其实很简单,可以用 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)

现在让我们对对象做同样的事情。

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 完全相同。

【讨论】:

  • @christopher 感谢重播我正在寻找这个答案。
【解决方案2】:

让我们有这个代码:

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)

这是真的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2012-10-05
    相关资源
    最近更新 更多