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
.