[英]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.