簡體   English   中英

為什么==適用於int,double等,但不適用於Java中的String

[英]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等。根據我的理解,“ ==”確定兩個實體是否指向同一個對象。

造成誤解的根源是原始值(例如1false3.14159不是對象。 它們是沒有對象標識的值。

在Java中,有兩種類型:

  • 原始數據類型... ==比較其值
  • 引用類型...,其中==比較對象標識

a和b在內存中具有不同的引用,但此語句返回true。

現在,您在混淆其他內容。 ab實際上是變量。 是的,在后台變量確實具有相應的內存地址。

但是... a == b不比較變量的地址 它比較變量的內容 變量的內容是沒有地址的原始值。

我以為“ ==”比較參考?

對於引用類型(對象和數組), ==運算符比較引用。

對於基本類型, ==運算符將比較實際值。

想一想。 無論數字如何生成,您都希望42等於42 ...。

回到String 盡管Java語言是“內置”的,但String類型是引用類型(類java.lang.String ),並且==使用引用類型語義對其進行比較; 即通過比較身份。 對於新的Java程序員來說,這是一個相當大的困惑(因此容易被關閉),但是,如果您了解大局,那是完全合乎邏輯的。


現在,當我們將包裝器類型和裝箱/拆箱放入組合中時,事情確實變得更加復雜。 但這超出了您的問題范圍。

比較字符串時您是正確的,但這是因為字符串是引用類型。 ==在引用類型上測試相同的引用,而不是在值上。

但是像intbooleanlongchar這樣的類型是原始類型或“值”類型,而不是引用類型。 那是; 變量表示實際 ; 而不是值存儲位置的引用。

請注意,上述版本有一些參考類型。 大寫的版本: IntBooleanLongChar 它們表示上面的基元的“盒裝”版本,並且==將引用與它們進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM