use*_*368 21 java primitive object equals-operator
在寻找有关逻辑相等如何==在Java中工作的解释时,答案总是类似于以下内容:
但是这些解释似乎都暗示着这是两个不同的事物,它们的==行为根据您是否要比较对象还是原始而有所不同。在我看来,它们实际上必须是完全相同的东西:从堆栈中获取两个变量并比较它们的值。
变化的不是==它的行为,而是它所比较的值所代表的含义。如果您要比较的东西是基元,那么堆栈上的值就是基元本身的值。如果要比较对象,则堆栈上的值就是引用的值(因此就是堆上对象的地址)。
我是否误解了某些东西,或者==在所有情况下实际上都表现相同?奖励积分是,如果您可以指向我了解如何在幕后真正发挥作用的文档。
Ste*_*n C 18
正如其他答案/评论所说,在Java语言级别,==操作者语义是以实现独立的方式指定的(在JLS 15.21中)。严格来说,您不能从JLS文本中推断“幕后”实现的详细信息。您只能说,任何符合的实现都==必须以某种特定方式运行。
我将假设我们正在谈论传统的JVM,其中引用的实际机器表示是机器地址。可以通过其他方式实现引用。例如使用一种间接寻址机制,如PIDLAM。
在字节码级,有许多的不同实现的逻辑字节码指令==根据类型(int,long或参考)。但是,比较的语义相似。一旦字节码被验证为类型安全的,就可以==在硬件级别比较整数和地址,以进行比较。
在硬件(机器指令)级别==,原始整数类型和非原始值的工作原理相同。在这两种情况下,它将执行一条机器指令,该指令比较来自寄存器或存储器(堆或堆栈)的两个“字”。
JLS指定==for float和的语义double有些不同,因为特殊值(无穷和非数字值)需要特殊处理。例如:NaN == NaN是false。另请参阅IEEE 754浮点标准。
对此有不同的字节码,并且在硬件级别,所使用的指令与在整数和参考情况下使用的指令不同。(特殊值的处理通常在浮动硬件中进行。)
所述JLS指定的语义==为boolean,byte,short和char是促进值到另一种类型(int,long,float或double比较之前)。如果操作数具有不同(未装箱)类型,则在其他情况下也会发生升级。
此外,如果将一个(但不是两个!)操作数装箱,则会发生拆箱操作。如果将两个操作数都装箱,==则为参考比较。
总结以上...
我是否有误解,还是==在所有情况下实际上都表现相同?
不,如果您包括浮点类型以及基本扩展和拆箱的注意事项,则不会。
奖励积分是,如果您可以指向我了解如何在幕后真正发挥作用的文档。
没有官方的(Oracle)公共文档。JLS和JVM规范没有规定实现策略。
| 归档时间: |
|
| 查看次数: |
761 次 |
| 最近记录: |