簡體   English   中英

比較兩個Integer Wrapper類

[英]Comparing two Integer Wrapper classes

為什么該程序在第一個打印語句中打印false,而在打印語句中打印true。 i和i1是兩個不同的對象,因此第一個語句必須按預期方式打印“ true”,但是第二個print語句則打印“ false”,這會造成混淆。

public static void main(String[] args) {
        Integer i = new Integer(10);
        Integer i1 = new Integer(10);
        System.out.println(i == i1); //printing false
        i++;
        i1++;
        System.out.println(i == i1);//printing true
    } 

使用new關鍵字始終會創建兩個不同的實例。 因此,以下始終是正確的:

new Integer(10) != new Integer(10)

因此,第一行打印“ false”。

然后:

i++;

隱藏拆箱和裝箱。 它等效於:

i = Integer.valueOf(i.intValue() + 1);

Integer.valueOf的Javadoc所述 ,將從-128到127(至少)的值緩存:您將為i++i1++取回Integer.valueOf(11)的緩存實例,因此第二行顯示“ true” ”。

這里:

Integer i = new Integer(10);
Integer i1 = new Integer(10);

您要求動態分配兩個Integer類類型的實例,這將為您提供兩個不同的引用。 如果將其更改為:

Integer i = 10;
Integer i1 = 10;

那么i和i1的引用將相等,因為對於較小的值,包裝器類使用緩存的對象。

這個:

    i++;
    i1++;

15.14.2中說明 JLS中的Postfix Increment Operator ++ (重點是我):

在添加之前,對值1和變量的值執行二進制數值提升(第5.6.2節) 如有必要,可通過縮小原始轉換(第5.1.3節) *和/或在存儲變量之前對其進行裝箱轉換(第5.1.7節)以將其轉換為變量類型。

下面的注釋也很重要,它說明在應用運算符之前,可能會發生拆箱轉換:

請注意,上述二進制數值升級可能包括拆箱轉換(第5.1.8節)和值集轉換(第5.1.13節)。 如有必要,將值集轉換應用於和,然后再將其存儲在變量中。 所以這意味着它被裝箱回到包裝類型

因此,最后在將運算符++應用於分配的Integer實例的引用類型或裝箱的Integer類之后,如果其值在裝箱類型的正確范圍內,則以裝箱的Integer結尾。

第一個是引用比較,因此變為false,第二個是值比較(在遞增時,將其取消裝箱為基本int,因此增加為11並再次自動裝箱;對於i1相同)。 因此,第二次通話是(11 == 11)。

Integer類具有與equals方法一樣多的其他類。 您可以像這樣輕松地比較兩個Integer實例:

Integer int1 = new Integer(2);
Integer int2 = new Integer(2);
if(int2.equals(int1)) {
  // true
}

考慮在您自己的所有實體/ dto中實現equals方法:

class Car {
  private String color;
  private Integer model;

  public Car(String color, Integer model) {
    this.color = color;
    this.model = model; 
  }

  public String getColor() { return color; }
  public Integer getModel() { return model; }

  @Override
  public boolean equals(final Object obj) {
    if(this == obj) {
      return true;  // You are actually comparing the same instances
    }
    if(obj instanceof Car) {  // Now you know both obj are instances of class Car
      final Car other = (Car) obj;  // Safe to cast
      return Objects.equal(color, other.getColor())
        && Objects.equal(model, other.getModel()
        ;
    }
    return false;
  }
}

暫無
暫無

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

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