2 回答

TA貢獻1887條經驗 獲得超5個贊
在 Java 語言級別,==
運算符語義以獨立于實現的方式指定(在JLS 15.21中)。嚴格來說,您不能從 JLS 文本中推斷出“幕后”實現細節。您只能說,任何符合規范的實現都==
必須以某種方式運行。
我假設我們正在談論傳統的 JVM,其中引用的實際機器表示是機器地址??梢酝ㄟ^其他方式實現引用;例如,使用某種間接尋址機制,例如PIDLAM。
在字節碼級別,有許多不同的==
字節碼指令實現了依賴于類型(int
,或引用)的邏輯long
。但是,比較的語義是相似的。一旦字節碼被驗證為類型安全的,為了在硬件級別進行比較,就可以對整數和地址進行相同的處理。==
在硬件(機器指令)級別,==
原始整數類型和非原始值的工作方式相同。在這兩種情況下,它將執行一條機器指令,該指令比較從寄存器或內存(堆或堆棧)中獲取的兩個“字”。
JLS 指定的==
forfloat
和的語義double
有點不同,因為特殊值(無窮大和非數字值)需要特殊處理。例如:NaN == NaN 是false
.?另請參閱 IEEE 754 浮點標準。
為此有不同的字節碼,并且在硬件級別使用的指令與整數和參考案例中使用的指令不同。(特殊值的處理通常在浮動硬件中處理。)
JLS 指定了==
for?boolean
、和 is的語義byte
,以便在比較它們之前將值提升為另一種類型(、或) 。如果操作數具有不同的(未裝箱的)類型,則提升也會發生在其他情況下。?short
char
int
long
float
double
此外,如果一個(但不是兩個!)操作數被裝箱,則會發生拆箱。如果兩個操作數都被裝箱,則為==
引用比較。
總結以上...
我是不是誤解了什么,或者 == 實際上在所有情況下都表現得一樣?
不,如果您包括浮點類型,以及原始加寬和拆箱的注意事項,則不會。
如果你能給我指出這在幕后是如何工作的文檔,那就加分了。
沒有關于此的官方(Oracle)公共文檔。JLS 和 JVM 規范沒有規定實現策略。

TA貢獻1921條經驗 獲得超9個贊
我理解你的解釋,并且給出某些術語的定義是正確的。但它不符合 Java 談論對象和原語的方式。
在 Java 中“引用”對象的想法被嚴重低估了;我認為有可能成為一名“Java 程序員”卻并不真正了解什么是引用。您可以記住它產生影響的規則——“==”運算符,將參數傳遞給方法——而不理解它是如何實現的,或者可能是如何實現的。
所以我認為許多使用 Java 編程的人會感到困惑,因為說 == “在所有情況下都表現相同”,因為這涉及太多“幕后”知識。Java 不鼓勵您(或要求您)在那種程度上“深入了解”。
添加回答
舉報