web-dev-qa-db-fra.com

comparer avec des primitives -> Entier/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 second est meilleur, devrait être plus rapide et plus optimisé pour la mémoire. Mais ne sont-ils pas égaux?

61
Marek Sebera

Pour des performances optimales, il est généralement préférable de rendre le code aussi simple et clair que possible, ce qui donnera souvent de bons résultats (le JIT optimisant 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'objet 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'allez pas plus vite que ça.

135
Peter Lawrey

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 performances.

52
MForster

Puis-je proposer un troisième

((Integer) a).compareTo(b)  
12
Johan Sjöberg

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

Integer a = 3; 

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

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

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

compare = a - b;

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

4
user3697618

Pour les versions antérieures à 1.7, je dirais qu’un équivalent de Integer.compare (x, y) est:

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

Si vous utilisez Java 8, vous pouvez créer le comparateur à l'aide de cette méthode:

Comparator.comparingInt(i -> i);

si vous souhaitez comparer avec l'ordre inversé:

Comparator.comparingInt(i -> -i);
1
tanghao

Si vous avez juste besoin d'une valeur logique (comme c'est presque toujours le cas), la ligne suivante vous aidera

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

Et cela fonctionne 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(a-b)) > 0);
0
WebComer

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

(~a - ~b) >>> 31 | -((a - b) >>> 31)
public static void main(String[] 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
0
Eng.Fouad