67 votes

compareTo avec les primitives -> Integer / int

Est-il préférable d'écrire

int primitive1 = 3, primitive2 = 4;
Integer a = new Integer(primitive1);
Integer b = new Integer(primitive2);
int compare = a.compareTo(b);

ou

int primitive1 = 3, primitive2 = 4;
int compare = (primitive1 > primitive2) ? 1 : 0;
if(compare == 0){
    compare = (primitive1 == primitive2) ? 0 : -1;
}

Je pense que la seconde est meilleure, elle devrait être plus rapide et plus optimisée en termes de mémoire. Mais ne sont-ils pas égaux ?

13 votes

Ne jamais appeler "new Integer" mais plutôt utiliser Integer.valueOf(int) ( docs.oracle.com/javase/6/docs/api/java/lang/ ) cette méthode accède à un cache interne et évitera souvent une allocation pour les petits entiers.

2 votes

Pour info : Sur les JVM modernes (comme HotSpot), les deux programmes deviendront probablement le même code machine après optimisation. La meilleure façon d'en être sûr est (comme toujours) de comparer les deux solutions.

0 votes

@luke merci pour la remarque, c'est un super conseil !

143voto

Peter Lawrey Points 229686

Pour les performances, il est généralement préférable de rendre le code aussi simple et clair que possible, ce qui donne souvent de bons résultats (car le JIT optimise au mieux ce code). Dans votre cas, les exemples les plus simples sont également susceptibles d'être les plus rapides.


Je ferais soit

int cmp = a > b ? +1 : a < b ? -1 : 0;

ou une version plus longue

int cmp;
if (a > b)
   cmp = +1;
else if (a < b)
   cmp = -1;
else
   cmp = 0;

o

int cmp = Integer.compare(a, b); // in Java 7
int cmp = Double.compare(a, b); // before Java 7

Il est préférable de ne pas créer un objet si ce n'est pas nécessaire.

En termes de performances, le premier est le meilleur.

Si vous êtes sûr que vous n'obtiendrez pas de débordement vous pouvez utiliser

int cmp = a - b; // if you know there wont be an overflow.

tu ne pourras pas aller plus vite que ça.

62voto

MForster Points 2206

Utilisez Integer.compare(int, int) . Et n'essayez pas de micro-optimiser votre code, sauf si vous pouvez prouver que vous avez un problème de performance.

4 votes

Cette méthode est dans le JDK depuis 1.7 Je suis désolé, mais pour des questions de compatibilité, je ne peux pas l'utiliser jusqu'à présent.

0 votes

Y a-t-il un exemple de ce genre avant la version 1.7 ?

0 votes

@Ga, voir la réponse de Peter ci-dessus.

15voto

Johan Sjöberg Points 20759

Puis-je en proposer un troisième

((Integer) a).compareTo(b)

5voto

Transformer la primitive int en objet Integer vous coûtera un peu de mémoire, mais la différence ne sera significative que dans des cas très rares (demande de mémoire) (tableau avec 1000+ éléments). Je ne recommande pas d'utiliser le constructeur new Integer(int a) de cette façon. Ceci suffira :

Integer a = 3; 

Pour la comparaison, il existe Math.signum(double d).

compare= (int) Math.signum(a-b);

4voto

MQDuck Points 303

Ce sont déjà des ints. Pourquoi ne pas simplement utiliser la soustraction ?

compare = a - b;

Notez que Integer.compareTo() ne renvoie pas nécessairement que -1, 0 ou 1.

7 votes

Cela produira des résultats erronés en cas de dépassement. Essayez a = Integer.MAX_VALUE y b = -3 . Le résultat sera négatif, indiquant que a < b .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X