Como comparar corretamente dois inteiros em Java?

tl; O Dr. Minha opinião é usar um UNARIO + para acionar a descompactação em um dos operandos ao verificar valores iguais e simplesmente usar os operadores matemáticos. A lógica segue:

Já foi mencionado que a comparação == para Integer é a comparação de identidade, que Geralmente não é o que um programador quer, e que o objetivo é fazer uma comparação de valores; Mesmo assim, fiz uma pequena ciência sobre como fazer essa comparação da maneira mais eficiente, tanto em termos de compactação de código, correção e velocidade.

Eu usei os métodos usuais:

e obteve este código após compilação e descompilação:

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 você pode facilmente ver, o método 1 chamada Integer.equals() (obviamente), os métodos 2-4 resultam exatamente no mesmo código, desenvolvem os valores por meio de .intValue() e Em seguida, compare-os diretamente, e o método 5 simplesmente ativa uma comparação de identidade, sendo a forma errada de comparar valores.

Dado que (como já mencionado, por exemplo, JS) equals() Incurs uma sobrecarga (tem que fazer instanceof e uma conversão não comprovada), os métodos 2-4 trabalharão exatamente com a mesma velocidade, visivelmente melhor que o método 1 quando Eles usam loops apertados, já que o hotspot não é susceptível de otimizar o &

.

é bastante semelhante com outra comparação Operadores (por exemplo, < / >): Ative a descompactação, enquanto estiver usando não será, mas desta vez, a operação é altamente otimizável pelo HS, já que intValue() é apenas um método de getter (o candidato principal a ser otimizado fora).

no meu Opinião, versão 4, que é usada com pouca freqüência, é a maneira mais concisa: todos os desenvolvedores c / java experientes sabem que a vantagem do underry na maioria dos casos é igual à conversão para int / .intValue() – Embora possa ser um littlewtfmomento para alguns (principalmente aqueles que não usaram unary plus em sua vida), poderia dizer que ele mostra mais claramente e ligeiramente intenção: amostras: amostras Para a qual queremos um valor int de um dos operandos, forçando o outro valor ao desceber também. Também é indiscutivelmente mais semelhante à comparação i1 == i2 Regularmente usado para os valores primitivos int.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *