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 le deuxième est meilleur, devrait être plus rapide et plus de mémoire optimisée. Mais ne sont-ils pas égaux?

Pour les performances, il est généralement préférable de rendre le code aussi simple et clair que possible et cela sera souvent très efficace (le JIT optimisera 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; 

ou

 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 d'object si vous n'en avez pas besoin.

Performance sage, le premier est le meilleur.

Si vous savez avec certitude que vous n’obtiendrez pas de débordement, vous pouvez utiliser

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

vous n'obtiendrez pas plus vite que cela.

Utilisez Integer.compare(int, int) . Et ne faites pas de micro-optimisation de votre code, sauf si vous pouvez prouver que vous avez un problème de performance.

Puis-je proposer un troisième

 ((Integer) a).compareTo(b) 

Envelopper int primitive dans Integer object 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 plus de 1000 éléments). Je ne recommanderai pas l’utilisation d’un nouveau constructeur Integer (int a) de cette façon. Cela suffira:

 Integer a = 3; 

A propos de la comparaison, il y a Math.signum (double d).

 compare= (int) Math.signum(ab); 

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

 compare = a - b; 

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

Pour pre 1.7, je dirais qu’un équivalent à Integer.compare (x, y) est:

 Integer.valueOf(x).compareTo(y); 

Si vous utilisez Java 8, vous pouvez créer Comparator par cette méthode:

 Comparator.comparingInt(i -> i); 

si vous souhaitez comparer avec l’ordre inverse:

 Comparator.comparingInt(i -> -i); 

Vous pouvez le faire via la manipulation des bits, quelque chose comme ceci:

 (~a - ~b) >>> 31 | -((a - b) >>> 31) 
 public static void main(Ssortingng[] args) { int a = 107; int b = 106; check(a, b); a = 106; b = 106; check(a, b); a = 106; b = 107; check(a, b); } public static void check(int a, int b) { System.out.println((~a - ~b) >>> 31 | -((a - b) >>> 31)); } 

SORTIE:

 1 0 -1 

Si vous avez simplement besoin d’une valeur logique (comme c’est presque toujours le cas), la liste suivante vous aidera à:

 boolean ifIntsEqual = !((Math.max(a,b) - Math.min(a, b)) > 0); 

Et ça marche même en Java 1.5+, peut-être même en 1.1 (je n’en ai pas). S’il vous plaît dites-nous, si vous pouvez le tester en 1.5-.

Celui-ci fera aussi:

 boolean ifIntsEqual = !((Math.abs(ab)) > 0);