Что такое .intValue() в Java?
В чем разница между ними?
l
является arraylist типа Integer.
версия 1:
int[] a = new int[l.size()];
for (int i = 0; i < l.size(); i++) {
a[i] = l.get(i);
}
return a;
версия 2:
int[] a = new int[l.size()];
for (int i = 0; i < l.size(); i++) {
a[i] = l.get(i).intValue();
}
return a;
Ответы
Ответ 1
l.get(i);
вернет Integer
, а затем вызовет intValue();
на нем вернет целое число как type int
.
Преобразование int
в Integer
называется бокс.
Преобразование Integer
в int
называется распаковкой
И так далее для преобразования между другими примитивными типами и соответствующими классами Wrapper.
Начиная с java 5, он автоматически выполнит необходимые для вас преобразования (автобоксинг), поэтому при использовании Java 5 или более поздней версии нет разницы в ваших примерах. Единственное, что вам нужно ухаживать, это, если Integer
имеет значение null, и вы напрямую назначаете его int
, тогда он будет генерировать исключение NullPointerException.
До java 5 сам программист должен был делать бокс/распаковку.
Ответ 2
Как вы заметили, intValue
не очень полезен, когда вы уже знаете, что у вас есть Integer
. Однако этот метод не объявлен в Integer
, а в общем классе Number
. В ситуации, когда вы знаете, что у вас есть Number
, вы поймете полезность этого метода.
Ответ 3
Объект, возвращаемый l.get(i), является экземпляром класса Integer.
intValue() - это метод экземпляра класса Integer, который возвращает примитив int.
См. справочный документ Java...
http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#intValue()
Ответ 4
Java поддерживает два типа структур, которые сначала являются примитивами, а вторыми являются объекты.
Метод, который вы запрашиваете, используется для извлечения значения из объекта в примитив.
Все типы java, которые представляют число, расширяют класс Number. Эти методы в какой-то степени устарели, если вы используете тот же примитив и тип объекта, поскольку [autoboxing] был реализован в Java 1.5.
int - примитивный
Целое - объект
До Java 1.5 мы были вынуждены писать
int i = integer.intValue();
так как Java 1.5 мы можем написать
int i = integer;
Эти методы также используются, когда нам нужно изменить наш тип от Integer до long
long l = integer.longValue();
Ответ 5
get(i)
вернет объект Integer
и получит его значение при вызове intValue()
. В первом случае произойдет автоматическое auto-unboxing
.
Ответ 6
Это просто удобный метод получения примитивного значения из объекта Number
: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Number.html
Рассмотрим код:
Integer integerValue = Integer.valueOf(123);
float floatValue = integerValue.floatValue();
Последняя строка - удобный способ:
float floatValue = (float)(int)integerValue;
Так как любой числовой тип в Java может быть явно добавлен к любому другому примитивному числовому типу, класс Number
реализует все эти преобразования. Как обычно, некоторые из них не имеют большого смысла:
Integer integerValue = Integer.valueOf(123);
int intValue = integerValue.intValue();
int intValue2 = (int)integerValue;
int intValue3 = integerValue;
Ответ 7
Они точно такие же. Как упоминалось в других плакатах, вы можете поместить в массив либо объект Integer
, либо примитив int
. В первом случае компилятор автоматически преобразует объект Integer
в примитив. Это называется автоматическим боксом.
Ответ 8
Рассмотрим этот пример:
Integer i = new Integer(10);
Integer j = new Integer(10);
if (!(i == j)) {
System.out.println("Surprise, doesn't match!");
}
if (i.intValue() == j.intValue()) {
System.out.println("Cool, matches now!");
}
который печатает
Surprise, doesn't match!
Cool, matches now!
Это доказывает, что intValue()
имеет большое значение. Тем более, что Java не позволяет хранить примитивные типы непосредственно в контейнерах, и очень часто нам нужно сравнивать значения, хранящиеся в них. Например:
oneStack.peek() == anotherStack.peek()
не работает так, как мы обычно ожидаем, в то время как приведенный ниже оператор выполняет свою работу, очень похоже на обходной путь:
oneStack.peek().intValue() == anotherStack.peek().intValue()