【发布时间】:2019-12-23 18:10:09
【问题描述】:
在搜索逻辑等于 == 在 Java 中如何工作的解释时,答案总是如下:
- 对于基元,它返回基元是否具有相同的值(这包括将基元与其 WrapperObject 进行比较,因为 WrapperObject 会自动拆箱为基元)。
- 对于对象,它返回它们是否代表堆上的同一个对象。
但这些解释似乎都暗示这是 2 种不同的东西,== 的行为不同,具体取决于您是在比较对象还是原语。在我看来,它们实际上一定是完全相同的东西:从堆栈中取出两个变量并比较它们的值。
改变的不是== 的行为,而是它所比较的值所代表的内容。如果您要比较的东西是原语,那么 Stack 上的值就是原语本身的值。如果你在比较对象,那么堆栈上的值就是引用的值(因此是堆上对象的地址)。
我是否误解了某些内容,或者== 在所有情况下的行为实际上都是一样的?如果您可以向我指出有关这在幕后如何真正起作用的文档,则可以加分。
【问题讨论】:
-
跳过中间人,直接进入权威来源:Java Language Reference § 15.21, Equality Operators。但我认为你的想法是正确的:无论你是在处理数字、布尔值还是引用的比较,它们都归结为值的比较。
-
从计算机的角度来看,这并不意味着它在做两件不同的事情——这种解释是从人类的角度来看的。
-
如果你从概念上将Java中的对象引用想象成C中的指针,那么对象引用的内容、值就是一个数字:内存中我们可以找到对象内容的地方。所以,是的,
objectX == objectY类似于比较两个原始整数,从这个意义上说,==在比较原始值和比较对象引用方面确实表现相同。希望这能让您放心……但正如 Stephen C 的正确答案所解释的那样,真正重要的是 Java 规范定义的行为。
标签: java object primitive equals-operator