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;
}
Я думаю, что второй лучше, надо быстрее и больше памяти оптимизирован. Но разве они не равны?
9 ответов:
для повышения производительности обычно лучше всего сделать код максимально простым и понятным, и это часто будет хорошо работать (поскольку 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.
вы не получите быстрее.
использовать
Integer.compare(int, int)
. И не пытайтесь микро-оптимизировать свой код, если вы не можете доказать, что у вас есть проблемы с производительностью.
обертывание int примитива в целочисленный объект будет стоить вам некоторой памяти, но разница будет значительной только в очень редких случаях(потребность в памяти) (массив с 1000+ элементами). Я не буду рекомендовать использовать новый Integer(int a) конструктор таким образом. Этого будет достаточно :
Integer a = 3;
о сравнении есть математика.Сигнум (двойной д).
compare= (int) Math.signum(a-b);
они уже внутри. Почему бы просто не использовать вычитание?
compare = a - b;
обратите внимание на это целое число.compareTo () не обязательно возвращает только -1, 0 или 1.
для pre 1.7 я бы сказал, что эквивалентно целому числу.сравнить(x, y) это:
Integer.valueOf(x).compareTo(y);
Если вы используете java 8, Вы можете создать компаратор с помощью этого метода:
Comparator.comparingInt(i -> i);
Если вы хотите сравнить с обратном порядке:
Comparator.comparingInt(i -> -i);
вы можете сделать это с помощью битовой манипуляции, что-то вроде этого:
(~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
Если вам нужно просто логическое значение (как это почти всегда), вам поможет следующий однострочный:
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);