compareTo с примитивами-> Целое число / интервал

Лучше записать

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;
}

Я думаю, что второй лучше, должно быть быстрее и больше оптимизированной памяти. Но разве они не, равняются?

62
задан 5 February 2012 в 19:30

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.

, Вы не станете быстрее, чем это.

137
ответ дан 31 October 2019 в 13:08

Используйте Integer.compare(int, int) . И don'try для микрооптимизирования кода, если Вы не можете доказать, что у Вас есть проблема производительности.

56
ответ дан 31 October 2019 в 13:08

Позвольте мне предложить треть

((Integer) a).compareTo(b)  
13
ответ дан 31 October 2019 в 13:08

Обертывание международного примитива в Целочисленный объект будет стоить Вам некоторой памяти, но разница будет только значительной в очень редком (спрос на память) случаи (массив с 1 000 + элементы). Я не рекомендую использовать новое Целое число (интервал a) конструктор этот путь. Это будет достаточно:

Integer a = 3; 

О сравнении существует Math.signum (удвойте d).

compare= (int) Math.signum(a-b); 
6
ответ дан 31 October 2019 в 13:08

Они уже ints. Почему не только используют вычитание?

compare = a - b;

Примечание, что Integer.compareTo () не обязательно возвращает только-1, 0 или 1 также.

4
ответ дан 31 October 2019 в 13:08

Поскольку пред 1,7 я сказал бы, что эквивалент Integer.compare (x, y):

Integer.valueOf(x).compareTo(y);
3
ответ дан 31 October 2019 в 13:08

При использовании java 8 можно создать Компаратор этим методом:

Comparator.comparingInt(i -> i);

, если требуется соответствовать обратному порядку:

Comparator.comparingInt(i -> -i);
1
ответ дан 31 October 2019 в 13:08

Можно сделать это через побитовую обработку, что-то вроде этого:

(~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
0
ответ дан 31 October 2019 в 13:08

При необходимости просто в логическом значении (как это почти всегда), следующая острота поможет Вам:

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);
0
ответ дан 31 October 2019 в 13:08

Другие вопросы по тегам:

Похожие вопросы: