Сравнение целых значений - PullRequest
26 голосов
/ 05 июня 2009

Я начинающий Java-кодер, и я только что прочитал переменную целочисленного класса, которая может быть описана тремя различными способами в API. У меня есть следующий код:

if (count.compareTo(0)) { 
            System.out.println(out_table);
            count++;
    }

Это внутри цикла и просто выводит out_table.
Моя цель состоит в том, чтобы выяснить, как узнать, является ли значение целым числом count > 0.

Я понимаю, count.compare(0) - это правильный путь? или это count.equals(0)?

Я знаю, что count == 0 неверно. Это правильно? Есть ли оператор сравнения значений, где его просто count=0?

Ответы [ 7 ]

30 голосов
/ 05 июня 2009

Чтобы выяснить, является ли Integer больше 0, вы можете:

  • проверьте, возвращает ли compareTo(O) положительное число:

    if (count.compareTo(0) > 0)
         ...
    

    Но это выглядит довольно глупо, не так ли? Лучше просто ...

  • использование автобокс 1 :

    if (count > 0)
        ....
    

    Это эквивалентно:

    if (count.intValue() > 0)
        ...
    

    Важно отметить, что "==" оценивается следующим образом: операнд Integer распакован, а не int в штучной упаковке. В противном случае count == 0 вернет false, когда count будет инициализирован как new Integer(0) (потому что "==" проверяет равенство ссылок).

1 Технически, в первом примере используется автобокс (до Java 1.5 вы не могли передать int в compareTo), а во втором примере распаковка . Комбинированную функцию часто просто называют «автобоксом» для краткости, которая затем часто расширяется до вызова обоих типов конверсий «автобоксом». Я извиняюсь за слабое использование терминологии.

25 голосов
/ 05 июня 2009

Целые числа автоматически загружены, так что вы можете просто сделать

if (count > 0) {
    .... 
}
13 голосов
/ 05 июня 2009

Вы также можете использовать равно:

 Integer a = 0;

 if (a.equals(0)) {
     // a == 0
 }

, что эквивалентно:

 if (a.intValue() == 0) {
     // a == 0
 }

, а также:

 if (a == 0) {

 }

(компилятор Java автоматически добавляет intValue ())

Обратите внимание, что автобокс / автобокс может привести к значительным накладным расходам (особенно внутри циклов).

13 голосов
/ 05 июня 2009

Лучше избегать ненужного автобокса по двум причинам.

Во-первых, это немного медленнее, чем int < int, так как вы (иногда) создаете дополнительный объект;

void doSomethingWith(Integer integerObject){ ...
  int i = 1000;
  doSomethingWith(i);//gets compiled into doSomethingWith(Integer.valueOf(i));

Большая проблема в том, что скрытый автобокс может скрывать исключения:

void doSomethingWith (Integer count){
  if (count>0)  // gets compiled into count.intValue()>0

Вызов этого метода с помощью null вызовет NullPointerException.

Разделение между примитивами и объектами-обертками в java всегда описывалось как стремление к скорости. Автобокс почти скрывает это, но не совсем - чище просто следить за типом. Поэтому, если у вас есть объект Integer, вы можете просто вызвать compare() или intValue(), а если у вас есть примитив, просто проверьте значение напрямую.

3 голосов
/ 05 июня 2009

Хотя вы, безусловно, можете использовать метод compareTo в экземпляре Integer, при чтении кода это неясно, поэтому вам, вероятно, следует избегать этого.

Java позволяет использовать автобокс (см. http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html), чтобы сравнить напрямую с int, поэтому вы можете сделать:

if (count > 0) { }

И экземпляр Integer count автоматически преобразуется в int для сравнения.

Если у вас возникли проблемы с пониманием этого, проверьте ссылку выше или представьте, что это происходит так:

if (count.intValue() > 0) { }
1 голос
/ 28 сентября 2012

Еще одна вещь, на которую следует обратить внимание: если второе значение было другим целочисленным объектом, а не литералом '0', оператор '==' сравнивает указатели объекта и автоматически не снимает флажок.

е:

Integer a = new Integer(0);   
Integer b = new Integer(0);   
int c = 0;

boolean isSame_EqOperator = (a==b); //false!
boolean isSame_EqMethod = (a.equals(b)); //true
boolean isSame_EqAutoUnbox = ((a==c) && (a.equals(c)); //also true, because of auto-unbox

//Note: for initializing a and b, the Integer constructor 
// is called explicitly to avoid integer object caching 
// for the purpose of the example.
// Calling it explicitly ensures each integer is created 
// as a separate object as intended.
// Edited in response to comment by @nolith
0 голосов
/ 11 июля 2017

Хорошо, я мог бы опоздать на это, но я хотел бы поделиться кое-чем:

С учетом ввода: System.out.println (isGreaterThanZero (-1));

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.compareTo(0) > 0;
}

Возвращает false

public static boolean isGreaterThanZero(Integer value) {
    return value == null?false:value.intValue() > 0;
}

Возвращает истину Поэтому я думаю, что в вашем случае «сравнить» будет более точным.

...