tl; dr la meva opinió des d’un +
unari per desencadenar el desempaquetat en un dels operands a l’verificar la igualtat de valors, i simplement usar els operadors matemàtics en cas contrari. La lògica segueix:
Ja s’ha esmentat que la comparació ==
per Integer
és la comparació d’identitat, que generalment no és el que vol un programador, i que l’objectiu és fer una comparació de valors; tot i així, he fet una mica science sobre com fer aquesta comparació de la manera més eficient, tant en termes de compacitat de codi, correcció i velocitat.
Vaig utilitzar els mètodes habituals:
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;}
i vaig obtenir aquest codi després de la compilació i descompilació:
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; }}
Com pot veure fàcilment, el mètode 1 crida a Integer.equals()
(òbviament), els mètodes 2-4 donen com a resultat exactament el mateix codi, desenvolupen els valors per mitjà de .intValue()
i després els comparen directament, i el mètode maig simplement s’activa un Comparació d’identitat, sent la forma incorrecta d’comparar valors.
Atès que (com ja es va esmentar, per exemple, JS) equals()
incorre en una sobrecàrrega (ha de fer instanceof
i una conversió no comprovada), els mètodes 2-4 funcionaran exactament amb la mateixa velocitat, notablement millor que el mètode 1 quan es s’usen en loops estrets, ja que HotSpot no és probable que optimitzi els models & instanceof
.
És bastant similar amb altres operadors de comparació (per exemple, <
/ >
): activaran el desempaquetat, mentre que l’ús de compareTo()
no ho farà, però aquesta vegada, l’operació és altament optimitzable per HS ja que intValue()
és només un mètode getter (candidat principal per a ser optimitzat fora).
en la meva opinió, la versió 4, que s’usa amb poca freqüència, és la forma més concisa: tots els desenvolupadors experimentats de C / Java saben que l’avantatge unària en la majoria dels casos és igual a la conversió a int
/ .intValue()
– encara que pot ser un pocoWTFmomento per a alguns (principalment aquells que no van usar unary més en la seva vida), podria dir-se que mostra la intenció més clara i tersamente: mostra el detall del a que volem un valor int
d’un dels operands, forçant a l’altre valor a Unbox també. També és indiscutiblement més similar a la comparació i1 == i2
regular utilitzada per als valors primitius int
.