2016-08-15 83 views
-1

我想知道「==」運算符如何處理原始值。我知道「==」會檢查兩個引用是否引用了堆上的同一個對象。 但是它如何在原始值的上下文中存儲在堆棧中? e.g「==」如何在原始類型上工作

int a = 5; int b = 5;

我認爲這些值不存儲在同一個地方的內存,但 一個== b返回「真」。

我的推測是JVM將存儲在堆棧中的所有值存儲在內存中的一個位置,並在「==」的情況下返回true。 你能否以更詳細的方式向我解釋這件事?

Regards

+0

你能清楚知道你到底想知道什麼嗎?你的問題非常模糊。 – 4castle

+0

它按價值比較它們。 – khelwood

+0

可能的重複:http://stackoverflow.com/questions/1586223/how-does-the-tostring-equals-object-methods-work-differently-or-similar –

回答

7

你的假設是錯誤的。比較原語時,沒有內存地址在播放。這是一個簡單的指令,用於比較一個值是否等於另一個值,在字節碼中作爲比較(寄存器值)和條件跳轉來實現。

1

編輯:正如James和Varun指出的那樣,我的原始答案不適用於OP的示例,因爲對象引用是一個數值,就像整數一樣。所以在這種情況下比較操作實際上是相同的。


在其他語言中有一些稱爲操作符重載的東西。 Java不支持用戶操作符重載,但瞭解這些工作將如何讓您更好地瞭解同一個操作符可以根據上下文使用不同的邏輯。

當您比較變量和原語時,生成的機器碼與比較兩個對象時執行不同的比較操作。使用相同的語法是因爲比較的想法在邏輯上足夠類似以保證使用相同的運算符符號,而不是爲兩個不同的功能定義完全不同的符號。

+2

深入研究處理器,它只是一個比較指令。現在,CMP操作碼的不同尋址模式可能取決於CPU架構。在非常基本的模式下,將使用一個帶有索引(與堆棧變量相關)的幀指針來讀取這兩個變量,並且將生成跳轉等於或跳轉不等於操作碼。 –

+1

實際上,類似於整數類型的'=='的實現實際上與它如何實現對象引用相同,因爲對象引用_is_只是一個數字。 –

+0

詹姆斯和瓦倫你都是對的。我將編輯我的答案以反映這一點。 – Jcross

0

對於任何比較操作,JVM都會查找操作數的數據類型。根據操作數類型的不同,使用不同的Java字節碼指令進行比較。

JVM適用於兩種數據類型。

根據JVM 7 specification

像Java編程語言,Java虛擬機運行 對兩種類型:基本類型和引用類型。相應地,有 ,兩種可以存儲在變量中的值, 作爲參數傳遞,由方法返回,並在以下基礎上操作:基本值 值和參考值。

參考文獻也是類型reference的值。

Java虛擬機包含對對象的顯式支持。一個 對象是一個動態分配的類實例或一個數組。對對象的引用被認爲具有Java虛擬機類型 的引用。類型引用的值可以被看作是指向 對象的指針。可能存在對一個對象的多個引用。對象總是在 上運行,通過並通過類型引用的值進行測試。

對於原語類型和引用類型的算術運算,JVM使用操作碼指定參數的數據類型以及操作。

例如, lcmp - 比較兩個長值

最後,JVM的運算是給定的操作數字節算術。