正如其他答案/注释所说,在Java语言级别,运算符语义(在JLS 15.21中)以独立于实现的方式指定。严格来说,您无法从 JLS 文本中推断出“幕后”实现细节。您只能说,任何符合要求的实现都必须以某种方式运行。==
==
我将假设我们正在谈论传统的JVM,其中引用的实际机器表示是机器地址。可以通过其他方式实现引用;例如,使用某种间接寻址机制,如PIDLAM。
在字节码级别,有许多不同的字节码指令实现取决于类型(或引用)的逻辑。但是,比较的语义是相似的。一旦字节码被验证为类型安全,就可以对整数和地址进行相同的处理,以便在硬件级别进行比较。==
int
long
==
在硬件(机器指令)级别,对于基元积分类型和非基元值,其工作原理相同。在这两种情况下,它都将执行一个机器指令,该指令比较从寄存器或内存(堆或堆栈)中获取的两个“字”。==
JLS 指定的 for 和 的语义略有不同,因为特殊值(无穷大和非数字值)需要特殊处理。例如:NaN == NaN 是 。另请参阅 IEEE 754 浮点标准。==
float
double
false
这有不同的字节码,在硬件级别,使用的指令与整数和参考情况下使用的指令不同。(特殊值的处理通常在浮动硬件中处理。
JLS 指定了 for 、 的语义,并在比较值之前将这些值提升为另一种类型 (、 、 或 )。如果操作数具有不同(未装箱)的类型,则其他情况也会发生升级。==
boolean
byte
short
char
int
long
float
double
此外,如果一个(但不是两个!)操作数被装箱,则会发生取消装箱。如果两个操作数都装箱,则为参考比较。==
总结以上...
我是否误解了某些内容,或者==在所有情况下实际上都表现得一样?
不,如果您包括浮点类型,以及基元加宽和取消装箱的注意事项,则不会。
奖励点,如果你能指出我关于这如何在幕后真正工作的文档。
没有官方(Oracle)公共文档。JLS 和 JVM 规范没有规定实现策略。