2 回答

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

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