簡體   English   中英

為什么Integer.MIN_VALUE不等於變量中存儲的Integer.MIN_VALUE?

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

MINF == this.headfalse ,盡管this.head = -2147483648

Integer.MIN_VALUE == this.headtrue

我是否因為第二個錯誤的原因而錯過了某些東西?

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 原因是:

  1. Integer.MIN_VALUE返回一個int ,而不是Integer
  2. 您已將MINF定義為Integer
  3. 自動裝箱使用valueOf 請參閱自動裝箱是否調用valueOf()?
  4. 如果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.

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