[英]Why isn't Integer.MIN_VALUE equal to stored Integer.MIN_VALUE in variable?
我使用以下字段制作了一個Interval類:
...
private static final Integer MINF = Integer.MIN_VALUE;
Integer head,tail;
...
當我創建此類的實例時,使this.head = Integer.MIN_VALUE
,並且我想檢查head的值是否等於MINF
,它表示它們不相等。
Interval i = new Interval(Integer.MIN_VALUE,10);
System.out.println(i.toString()); //[-2147483648,10]
所以我繼續嘗試打印值,
public String toString() {
...
//What the hell?
System.out.println("MINF == Integer.MIN_VALUE: " + (MINF == Integer.MIN_VALUE)); //true
System.out.println("MINF == this.head: " + (MINF == this.head)); //false
System.out.println("Integer.MIN_VALUE == this.head: " + (Integer.MIN_VALUE == this.head)); //true
...
return "*insert interval in format*";
}
哪說
MINF == Integer.MIN_VALUE
為true
MINF == this.head
為false ,盡管this.head = -2147483648
Integer.MIN_VALUE == this.head
為true
我是否因為第二個錯誤的原因而錯過了某些東西?
Integer是包裝類,是Object的子級,並且包含int
值。
如果僅使用基本類型int
,則==
進行數值比較,而不進行對象地址比較。
請注意, Integer.MIN_VALUE
當然也是一個int
。
您缺少這樣一個事實:當將其存儲在Integer中(即,將Integer.MIN_VALUE存儲在兩個不同的整數中)並且在它們之間使用==時,比較不是值的比較,而是對象的比較。 對象不同,因為它們是兩個不同的對象。 當將每個對象與Integer.MIN_VALUE進行比較時,由於Integer.MIN_VALUE是一個int,因此該對象將自動拆箱並使用int比較進行比較。
這里沒有人提到原因,為什么它們是不同的對象。 明顯:
System.out.println(new Integer(10) == new Integer(10));
輸出false,原因是在此問題的其他答案以及“ 比較整數”對象中已討論到死的原因
但是,為什么會在這里發生呢? 您似乎沒有在調用new Integer
。 原因是:
Integer.MIN_VALUE
返回一個int
,而不是Integer
。 MINF
定義為Integer
valueOf
。 請參閱自動裝箱是否調用valueOf()? int
不在整數緩存中 ,則valueOf
調用new Integer
,
-128 -> 127
含)。 這就是為什么由於自動裝箱而看到“兩個Integer
對象不是==
行為”的原因。 自動裝箱也是為什么平等在這里似乎不具有傳遞性的原因。
您可以改用以下方法解決此問題:
private static final int MINF = Integer.MIN_VALUE;
而且,通常: 不要將Integer
用於簡單字段。 ; 僅將它用作您實際需要該對象的泛型類型。
您正在使用Integer
對象。 ==
的使用應僅用作單個原始值的比較。 由於您使用的是Integer
類而不是原始的int
因此它將在兩個變量之間而不是它們的值之間比較對象的引用。
由於MINF
是一個單獨的對象,以head
您所使用的直接比較接受虛假==
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.