сравнить с примитивами -> Integer / int - PullRequest
61 голосов
/ 05 февраля 2012

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

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 ]

135 голосов
/ 05 февраля 2012

Для повышения производительности обычно лучше сделать код максимально простым и понятным, и это часто будет работать хорошо (так как 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.

Вы не получите быстрее, чем это.

54 голосов
/ 05 февраля 2012

Использование Integer.compare(int, int). И не беспокойтесь о микрооптимизации вашего кода, если только вы не докажете, что у вас есть проблемы с производительностью.

13 голосов
/ 05 февраля 2012

Могу ли я предложить третий

((Integer) a).compareTo(b)  
6 голосов
/ 05 февраля 2012

Включение примитива int в объект Integer обойдется вам в некоторую память, но разница будет существенной только в очень редких случаях (потребность в памяти) (массив с 1000+ элементами). Я не буду рекомендовать использовать новый конструктор Integer (int a) таким образом. Этого будет достаточно:

Integer a = 3; 

О сравнении есть Math.signum (double d).

compare= (int) Math.signum(a-b); 
4 голосов
/ 28 мая 2015

Они уже целые. Почему бы просто не использовать вычитание?

compare = a - b;

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

3 голосов
/ 17 ноября 2015

Для pre 1.7 я бы сказал, что эквивалент Integer.compare (x, y):

Integer.valueOf(x).compareTo(y);
1 голос
/ 20 мая 2017

Если вы используете Java 8, вы можете создать Comparator следующим способом:

Comparator.comparingInt(i -> i);

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

Comparator.comparingInt(i -> -i);
0 голосов
/ 15 декабря 2017

Если вам нужно просто логическое значение (как оно почти всегда есть), вам поможет следующий однострочный:

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 голосов
/ 05 февраля 2012

Это можно сделать с помощью битовых манипуляций, например:

(~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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...