Ответ 1
Целые функции autounboxed, поэтому вы можете просто сделать
if (count > 0) {
....
}
Я новичок 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
?
Целые функции autounboxed, поэтому вы можете просто сделать
if (count > 0) {
....
}
Чтобы выяснить, больше ли 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". Прошу прощения за мое слабое использование терминологии.
Лучше избегать ненужного автобоксинга по двум причинам.
Во-первых, он немного медленнее, чем 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()
, и если у вас есть примитив, просто проверьте значение напрямую.
Вы также можете использовать equals:
Integer a = 0;
if (a.equals(0)) {
// a == 0
}
что эквивалентно:
if (a.intValue() == 0) {
// a == 0
}
а также:
if (a == 0) {
}
(компилятор Java автоматически добавляет intValue())
Обратите внимание, что autoboxing/autounboxing может вводить значительные служебные данные (особенно внутри циклов).
Хотя вы, безусловно, можете использовать метод 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) { }
Еще одна вещь, на которую нужно обратить внимание, - это то, что вторым значением был другой объект 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
Хорошо, я мог бы опоздать на это, но я хотел бы поделиться чем-то:
Учитывая ввод: 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" будет более точным.