亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在比較 Java 中的兩個基元和兩個對象時,== 實際上工作相同還是不同?

在比較 Java 中的兩個基元和兩個對象時,== 實際上工作相同還是不同?

暮色呼如 2023-06-08 19:21:51
在尋找==Java 中邏輯等于如何工作的解釋時,答案總是類似于:對于圖元,它返回圖元是否具有相同的值(這包括將圖元與其 WrapperObject 進行比較,因為 WrapperObject 會自動拆箱為圖元)。對于對象,它返回它們是否代表堆上的同一個對象。但這些解釋似乎都暗示這是兩種不同的東西,它們的==行為不同取決于你是在比較對象還是基元。在我看來,它們實際上必須是完全相同的東西:從 Stack 中取出兩個變量并比較它們的值。改變的不是 的行為==,而是它所比較的值所代表的內容。如果你比較的東西是原語,那么 Stack 上的值就是原語本身的值。如果您正在比較對象,那么堆棧上的值就是引用的值(因此是對象在堆上的地址)。我是不是誤解了什么,或者==在所有情況下都表現得一樣?如果你能給我指出這在幕后是如何工作的文檔,那就加分了。
查看完整描述

2 回答

?
慕工程0101907

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,以便在比較它們之前將值提升為另一種類型(、或) 。如果操作數具有不同的(未裝箱的)類型,則提升也會發生在其他情況下。?shortcharintlongfloatdouble

此外,如果一個(但不是兩個!)操作數被裝箱,則會發生拆箱。如果兩個操作數都被裝箱,則為==引用比較。


總結以上...

我是不是誤解了什么,或者 == 實際上在所有情況下都表現得一樣?

不,如果您包括浮點類型,以及原始加寬和拆箱的注意事項,則不會。

如果你能給我指出這在幕后是如何工作的文檔,那就加分了。

沒有關于此的官方(Oracle)公共文檔。JLS 和 JVM 規范沒有規定實現策略。


查看完整回答
反對 回復 2023-06-08
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

我理解你的解釋,并且給出某些術語的定義是正確的。但它不符合 Java 談論對象和原語的方式。

在 Java 中“引用”對象的想法被嚴重低估了;我認為有可能成為一名“Java 程序員”卻并不真正了解什么是引用。您可以記住它產生影響的規則——“==”運算符,將參數傳遞給方法——而不理解它是如何實現的,或者可能是如何實現的。

所以我認為許多使用 Java 編程的人會感到困惑,因為說 == “在所有情況下都表現相同”,因為這涉及太多“幕后”知識。Java 不鼓勵您(或要求您)在那種程度上“深入了解”。


查看完整回答
反對 回復 2023-06-08
  • 2 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號