tl; dr Bence bir tekli kullanmaktır +
değeri eşitlik için denetleme işlenen birinde unboxing tetiklemek için ve sadece aksi matematik operatörleri kullanabilirsiniz. Gerekçe aşağıdaki gibidir:
O önce de bahsedildiği ==
için karşılaştırma Integer
bir programcı istediğini genellikle değildir ve amacı değer karşılaştırma yapmak olduğunu kimlik karşılaştırması, olduğu; yine de, hem kod kompaktlığı, doğruluk hem de hız açısından bu karşılaştırmanın en verimli şekilde nasıl yapılacağı hakkında biraz bilim yaptım .
Her zamanki yöntemleri kullandım:
public boolean method1() {
Integer i1 = 7, i2 = 5;
return i1.equals( i2 );
}
public boolean method2() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2.intValue();
}
public boolean method3() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2;
}
public boolean method4() {
Integer i1 = 7, i2 = 5;
return i1 == +i2;
}
public boolean method5() { // obviously not what we want..
Integer i1 = 7, i2 = 5;
return i1 == i2;
}
ve derleme ve ayrışma sonra bu kodu var:
public boolean method1() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
return var1.equals( var2 );
}
public boolean method2() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method3() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method4() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method5() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2 == var1 ) {
return true;
} else {
return false;
}
}
Kolayca görebileceğiniz gibi, yöntem 1 Integer.equals()
(açıkça) yöntemlerini çağırır , yöntem 2-4, tam olarak aynı kodla sonuçlanır , değerleri kullanarak .intValue()
ve sonra doğrudan karşılaştırır ve yöntem 5, bir kimlik karşılaştırmasını tetikler; değerleri karşılaştırır.
(Örn. JS tarafından daha önce belirtildiği gibi) equals()
bir ek yüke maruz kaldığı için (yapması instanceof
ve kontrol edilmeyen bir döküm), 2-4 yöntemleri, sıkı döngülerde kullanıldığında fark edilir şekilde yöntem 1'den daha iyi olacak şekilde, aynı hızda çalışacaktır, çünkü HotSpot dökümleri optimize etme olasılığı yüksek & instanceof
.
Diğer karşılaştırma operatörleriyle (ör. <
/ >
) Oldukça benzerdir - kullanmadan kutuyu açmayı tetikleyeceklerdir compareTo()
- ancak bu sefer, intValue()
sadece bir alıcı yöntemi ( optimize edilmeye en iyi aday) olduğu için işlem HS tarafından oldukça optimize edilebilir.
Bence, nadiren kullanılan sürüm 4 en özlü yoludur - her tecrübeli C / Java geliştirici o tekli bilir artı çoğu durumda olduğu için döküm için eşit int
/ .intValue()
- biraz olabilirken WTF bazıları için moment (çoğunlukla bu yapmadım yaşamları boyunca tekli artı kullanmayın), niyeti en açık ve en tersine gösterir - int
işlenenlerden birinin değerini istediğimizi , diğer değeri de kutudan çıkarmaya zorladığımızı gösterir. Ayrıca tartışmasız i1 == i2
olarak ilkel int
değerler için kullanılan düzenli karşılaştırmaya en çok benzemektedir .
Oyum , hem performans hem de tutarlılık nedenleriyle nesneler için i1 == +i2
& i1 > i2
stil için gidiyor Integer
. Ayrıca kodu, tür bildiriminden başka bir şey değiştirmeden ilkellere taşınabilir hale getirir. Adlandırılmış yöntemleri kullanmak, çok eleştirilen bigInt.add(10).multiply(-3)
stile benzer şekilde bana anlamsal gürültü katmak gibi görünüyor .