Подтвердить что ты не робот

Целочисленное сравнение значений

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

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

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

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

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

4b9b3361

Ответ 1

Целые функции autounboxed, поэтому вы можете просто сделать

if (count > 0) {
    .... 
}

Ответ 2

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

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

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

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

  • используйте autoboxing 1:

    if (count > 0)
        ....
    

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

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

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

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

Ответ 3

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

Во-первых, он немного медленнее, чем 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 всегда описывалось как kludge для скорости. Автобоксинг почти скрывает это, но не совсем - чище просто отслеживать тип. Поэтому, если у вас есть объект Integer, вы можете просто вызвать compare() или intValue(), и если у вас есть примитив, просто проверьте значение напрямую.

Ответ 4

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

 Integer a = 0;

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

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

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

а также:

 if (a == 0) {

 }

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

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

Ответ 5

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

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

if (count > 0) { }

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

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

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

Ответ 6

Еще одна вещь, на которую нужно обратить внимание, - это то, что вторым значением был другой объект Integer вместо литерала '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

Ответ 7

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

Учитывая ввод:   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;
}

Возвращает true Поэтому я думаю, что в вашем случае "compareTo" будет более точным.