CompareTo с примитивами → Integer/int
Лучше ли писать
int primitive1 = 3, primitive2 = 4;
Integer a = new Integer(primitive1);
Integer b = new Integer(primitive2);
int compare = a.compareTo(b);
или
int primitive1 = 3, primitive2 = 4;
int compare = (primitive1 > primitive2) ? 1 : 0;
if(compare == 0){
compare = (primitive1 == primitive2) ? 0 : -1;
}
Я думаю, что второй лучше, должен быть быстрее и оптимизировать память. Но разве они не равны?
Ответы
Ответ 1
Что касается производительности, обычно лучше сделать код максимально простым и понятным, и это часто будет работать хорошо (так как JIT лучше оптимизирует этот код). В вашем случае простейшие примеры также, вероятно, будут самыми быстрыми.
Я бы сделал либо
int cmp = a > b ? +1 : a < b ? -1 : 0;
или более длинная версия
int cmp;
if (a > b)
cmp = +1;
else if (a < b)
cmp = -1;
else
cmp = 0;
или же
int cmp = Integer.compare(a, b); // in Java 7
int cmp = Double.compare(a, b); // before Java 7
Лучше не создавать объект, если вам это не нужно.
Производительность мудрая, первая лучшая.
Если вы точно знаете, что вы не получите переполнение, вы можете использовать
int cmp = a - b; // if you know there wont be an overflow.
Вы не получите быстрее, чем это.
Ответ 2
Используйте Integer.compare(int, int)
. И не пытайтесь оптимизировать ваш код, если вы не можете доказать, что у вас проблема с производительностью.
Ответ 3
Могу ли я предложить третий
((Integer) a).compareTo(b)
Ответ 4
Обтекание int примитивным объекту Integer будет стоить вам некоторой памяти, но разница будет существенной только в очень редких случаях (памяти) (массив с 1000+ элементами). Я не буду рекомендовать использовать этот новый конструктор Integer (int a). Этого будет достаточно:
Integer a = 3;
О сравнении: Math.signum(double d).
compare= (int) Math.signum(a-b);
Ответ 5
Они уже ints. Почему бы просто не использовать вычитание?
compare = a - b;
Обратите внимание, что Integer.compareTo() необязательно возвращает только -1, 0 или 1.
Ответ 6
Для pre 1.7 я бы сказал, что эквивалент Integer.compare(x, y) равен:
Integer.valueOf(x).compareTo(y);
Ответ 7
Если вы используете java 8, вы можете создать Comparator с помощью этого метода:
Comparator.comparingInt(i -> i);
если вы хотите сравнить с измененным порядком:
Comparator.comparingInt(i -> -i);
Ответ 8
Вы можете сделать это с помощью манипуляции бит, примерно так:
(~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));
}
ВЫВОД:
1
0
-1
Ответ 9
Если вам нужно только логическое значение (как это почти всегда), следующий однострочный файл поможет вам:
boolean ifIntsEqual = !((Math.max(a,b) - Math.min(a, b)) > 0);
И он работает даже в Java 1.5+, возможно даже в 1.1 (у меня его нет). Скажите, пожалуйста, если вы можете проверить это в 1.5 -.
Это тоже сделает:
boolean ifIntsEqual = !((Math.abs(a-b)) > 0);