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 !

4voto

Dave Points 53

Pour la version pré 1.7, je dirais qu'un équivalent à Integer.compare(x, y) est :

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

3voto

tanghao Points 53

Si vous utilisez java 8, vous pouvez créer un comparateur par cette méthode :

Comparator.comparingInt(i -> i);

si vous souhaitez comparer avec l'ordre inversé :

Comparator.comparingInt(i -> -i);

0voto

Eng.Fouad Points 44085

Vous pouvez le faire via la manipulation des 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

-1voto

WebComer Points 456

Si vous n'avez besoin que d'une valeur logique (comme c'est presque toujours le cas), la phrase suivante vous sera utile :

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 l'affaire aussi :

boolean ifIntsEqual = !((Math.abs(a-b)) > 0);

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