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?
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.
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.
Puis-je proposer un troisième
((Integer) a).compareTo(b)
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);
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.
Pour les versions antérieures à 1.7, je dirais qu’un équivalent de Integer.compare (x, y) est:
Integer.valueOf(x).compareTo(y);
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);
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);
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