簡體   English   中英

java long數據類型比較

[英]java Long datatype comparison

為什么下面的代碼對於long3 == long2比較返回false ,即使它是文字的。

public class Strings {

    public static void main(String[] args) {
        Long long1 = 256L + 256L;
        Long long2 = 512L;
        Long long3 = 512L;
        System.out.println(long3 == long2);
        System.out.println(long1.equals(long2));
    }
}

Long是一個對象,而不是一個原始對象。 通過使用==您將比較參考值

你需要這樣做:

if(str.equals(str2))

正如你在第二次比較中所做的那樣。

編輯:我明白了......你在想其他對象就像String文字一樣。 他們不*。 即使這樣,你也不想使用== with String literals。

(* Autobox類型確實實現了flyweight模式,但僅用於值-128 - > 127.如果你使Long等於50你確實會有兩個對同一flyweight對象的引用。再次, 永遠不要使用==來比較它們。)

編輯添加:這在Java語言規范的第5.1.7節中有具體說明:

如果被裝箱的值p為真,假,字節或范圍為\\ u0000到\\ u007f的字符,或介於-128和127(含)之間的int或短數,則讓r1和r2為結果p的任何兩個拳擊轉換。 始終是r1 == r2的情況。

請注意, long 沒有特別提及,但是當前的Oracle和OpenJDK實現都是這樣做的(1.6和1.7),這是永遠不會使用的另一個原因==

Long l = 5L;
Long l2 = 5L;
System.out.println(l == l2);
l = 5000L;
l2 = 5000L;
System.out.println(l == l2);

輸出:

真正

您還可以使用以下方法從Long對象中獲取原始值:

str.longValue()

如果你想做

      str3==str2

這樣做..

     str3.longValue()==str2.longValue()

這樣可以更快地實現您的目的,因為您要比較兩個基本類型值而不是對象。

這里Long是一個Wrapper類,所以下面的行將比較引用而不是內容。

long3 == long2

它總是比** .longValue()**更好,如下所示

long3.longValue() == long2.longValue()

如果我們使用in-build equal()方法,也會使用null檢查執行相同的操作。

long3.equals(long2)

下面是java中equals()的內部實現

public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

暫無
暫無

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

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