他们之间有什么区别?
l
是整数类型的arraylist。
版本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;
答案 0 :(得分:46)
l.get(i);
将返回Integer
,然后在其上调用intValue();
将返回类型为int
的整数。
将int
转换为Integer
称为拳击
将Integer
转换为int
称为取消装箱
等等,用于其他原始类型与其相应的Wrapper类之间的转换。
从java 5开始,它将自动为您执行所需的转换(自动装箱),因此如果您使用的是Java 5或更高版本,在您的示例中没有区别。 唯一需要照顾的是,如果Integer
为空,并且您直接将其分配给int
,那么它将抛出NullPointerException。
在java 5之前,程序员自己不得不做装箱/拆箱。
答案 1 :(得分:8)
正如您所注意到的,当您已经知道自己拥有intValue
时,Integer
没什么用处。但是,此方法未在Integer
中声明,而是在一般Number
类中声明。如果您知道自己拥有Number
,那么您将意识到该方法的实用性。
答案 2 :(得分:5)
l.get(i)返回的对象是整数类的一个实例。
intValue()是 Integer 类的实例方法,它返回原语 int 。
请参阅Java参考文档... http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#intValue()
答案 3 :(得分:3)
Java支持两种类型的结构首先是基元,第二种是对象。
您要问的方法,用于从Object检索值到原语。
表示数字的所有java类型都扩展了类Number。如果使用相同的原语和对象类型,则这种方法在某种程度上已被弃用,因为[autoboxing]是在Java 1.5中实现的。
int - primitive
整数 - 对象
在Java 1.5之前,我们强制写入
int i = integer.intValue();
自Java 1.5以来我们可以编写
int i = integer;
当我们需要将类型从Integer更改为long
时,也会使用这些方法 long l = integer.longValue();
答案 4 :(得分:1)
get(i)
将返回Integer
个对象,并在您致电intValue()
时获取其值。在第一种情况下,会自动auto-unboxing
。
答案 5 :(得分:0)
这只是从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;
答案 6 :(得分:0)
它们完全一样。正如其他海报所提到的,您可以将Integer
对象或int
原语放入数组中。在第一种情况下,编译器会自动将Integer
对象转换为基元。这称为自动拳击。
答案 7 :(得分:0)
考虑以下示例:
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()