Comment comparer correctement deux entiers en Java?

TL; Dr Mon avis est d’utiliser un + Unario pour déclencher le déballage dans l’un des opérandes lors de la vérification des valeurs égales et utilisez simplement des opérateurs mathématiques autrement. La logique suit:

Il a déjà été mentionné que la comparaison == pour Integer est la comparaison d’identité, qui Généralement, ce n’est pas ce que veut un programmeur, et que l’objectif est de faire une comparaison des valeurs; Malgré tout, j’ai fait une petite science sur la manière de faire cette comparaison de la manière la plus efficace, à la fois en termes de compacité de code, de correction et de vitesse.

J’ai utilisé les méthodes habituelles:

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

et obtenu ce code après la compilation et la décompilation:

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

Comme vous pouvez le voir facilement, la méthode 1 appel Integer.equals() (évidemment), les méthodes 2-4 résultent exactement du même code, développer les valeurs au moyen de .intValue() et Puis comparez-les directement et la méthode 5 active simplement une comparaison d’identité, étant la forme erronée de la comparaison de valeurs de comparaison.

étant donné que (comme déjà mentionné, par exemple, JS) equals() encourt une surcharge (il doit faire instanceof et une conversion non éprouvée), les méthodes 2-4 fonctionneront exactement avec la même vitesse, sensiblement mieux que la méthode 1 quand Ils utilisent des boucles serrées, car le hotspot n’est pas susceptible d’optimiser le &

est assez similaire avec une autre comparaison opérateurs (par exemple, < /

/

« 9b00a1236c »>

): Activez le déballage, tout en utilisant ne sera pas, mais cette fois, l’opération est hautement optimisable par HS depuis intValue() est juste une méthode getter (candidat principal à optimiser à l’extérieur).

dans mon L’opinion, la version 4, qui est utilisée rarement, est la méthode la plus concise: tous les développeurs C / Java expérimentés savent que l’avantage unarry dans la plupart des cas est égal à la conversion à int / .intValue() – bien que cela puisse être un peuwtfmomento pour certains (principalement ceux qui n’utilisaient pas Unary Plus dans leur vie), pourrait dire que cela montre la plus clair et légèrement intention: échantillons A quoi nous voulons une valeur int de l’un des opérandes, forçant également l’autre valeur à la boîte de commande. Il est également indiscutablement plus similaire à la comparaison régulièrement utilisé pour les valeurs primitives int.

.

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *