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