[英]Why does == work for int, double etc, but not String in java
我不明白為什么運算符“ ==”不能用於比較字符串,但是可以用於比較int,double,float等。根據我的理解,“ ==”確定兩個實體是否指向同一個對象
int a = 10;
int b = 10;
if(a == b){
...
}
a和b在內存中具有不同的引用,但此語句返回true。 這是為什么? 我以為“ ==”比較參考?
我不明白為什么運算符“ ==”不能用於比較字符串,但是可以用於比較int,double,float等。根據我的理解,“ ==”確定兩個實體是否指向同一個對象。
造成誤解的根源是原始值(例如1
和false
和3.14159
不是對象。 它們是沒有對象標識的值。
在Java中,有兩種類型:
==
比較其值 ==
比較對象標識 a和b在內存中具有不同的引用,但此語句返回true。
現在,您在混淆其他內容。 a
和b
實際上是變量。 是的,在后台變量確實具有相應的內存地址。
但是... a == b
不比較變量的地址 。 它比較變量的內容 。 變量的內容是沒有地址的原始值。
我以為“ ==”比較參考?
對於引用類型(對象和數組), ==
運算符比較引用。
對於基本類型, ==
運算符將比較實際值。
想一想。 無論數字如何生成,您都希望42
等於42
...。
回到String
。 盡管Java語言是“內置”的,但String
類型是引用類型(類java.lang.String
),並且==
使用引用類型語義對其進行比較; 即通過比較身份。 對於新的Java程序員來說,這是一個相當大的困惑(因此容易被關閉),但是,如果您了解大局,那是完全合乎邏輯的。
現在,當我們將包裝器類型和裝箱/拆箱放入組合中時,事情確實變得更加復雜。 但這超出了您的問題范圍。
比較字符串時您是正確的,但這是因為字符串是引用類型。 ==
在引用類型上測試相同的引用,而不是在值上。
但是像int
, boolean
, long
, char
這樣的類型是原始類型或“值”類型,而不是引用類型。 那是; 變量表示實際值 ; 而不是值存儲位置的引用。
請注意,上述版本有一些參考類型。 大寫的版本: Int
, Boolean
, Long
, Char
。 它們表示上面的基元的“盒裝”版本,並且==
將引用與它們進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.