Como comparar correctamente dous enteiros en Java?

TL; DR A miña opinión é usar un + Unario para activar o desempaquetado nun dos operandos ao verificar os valores iguais e simplemente usar operadores matemáticos doutro xeito. A Lóxica segue:

Xa se mencionou que a comparación

para Integer é a comparación de identidade, que Xeralmente non é o que quere un programador, e que o obxectivo é facer unha comparación de valores; Aínda así, fixen unha pequena ciencia sobre como facer esa comparación de forma máis eficiente, tanto en termos de compacidade de código, corrección e velocidade.

Eu usei os métodos habituais:

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;}

e obtén este código despois da compilación e descompilación:

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; }}

Como pode ver facilmente o método 1 chamada Integer.equals() (obviamente), os métodos 2-4 resultan exactamente no mesmo código, desenvolven os valores mediante .intValue() e A continuación, compara-los directamente, eo método 5 simplemente activa unha comparación de identidade, sendo a forma incorrecta de comparar valores.

Dado que (como xa mencionado, por exemplo, JS) equals() incurre unha sobrecarga (ten que facer instanceof e unha conversión non probada), os métodos 2-4 funcionarán exactamente coa mesma velocidade, mellor que o método 1 cando Utilizan lazos axustados, xa que o punto de acceso non é probable que optimice o &

.

é bastante similar con outra comparación operadores (por exemplo, < / >): active a desembarque, mentres usa non, pero esta vez, a operación é moi optimizable por HS desde que intValue() é só un método de getter (o principal candidato a ser optimizado fóra).

no meu Opinión, a versión 4, que se usa con pouca frecuencia, é a forma máis concisa: todos os desenvolvedores de C / Java experimentados saben que a vantaxe nonaría na maioría dos casos é igual á conversión a int / .intValue() – Aínda que pode ser un poucowtfmomento para algúns (principalmente aqueles que non utilizaron uny plus na súa vida), podería dicir que mostra a máis claridade e lixeiramente a intención: mostras A que queremos un valor int dun dos operandos, forzando o outro valor a unxolo. Tamén é indiscutiblemente máis similar á comparación i1 == i2 usado regularmente para os valores primitivos int.

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *