34

它们之间有什么区别?

l是一个整数类型的数组列表。

版本 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;
4

8 回答 8

52

l.get(i);将返回Integer,然后调用intValue();它将返回整数作为 type int

转换intInteger称为装箱
将一个转换Integerint称为拆箱
等等,用于其他原始类型与其对应的 Wrapper 类之间的转换。

从 java 5 开始,它会自动为您进行所需的转换(自动装箱),因此如果您使用 Java 5 或更高版本,您的示例没有区别您唯一需要注意的是如果 anInteger为 null,并且您直接将其分配给它,int那么它将抛出 NullPointerException。

在 java 5 之前,程序员自己必须做装箱/拆箱。

于 2012-07-15T08:13:14.783 回答
9

正如您所注意到的,intValue当您已经知道自己有一个Integer. 但是,此方法不是在 中声明的Integer,而是在通用Number类中声明的。在您只知道自己拥有一些 的情况下Number,您将意识到该方法的实用性。

于 2012-07-15T08:21:07.603 回答
5

l.get(i)返回的 Object是Integer类的一个实例。

intValue()是返回原始int的Integer类的实例方法。

请参阅 Java 参考文档... http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#intValue()

于 2012-07-15T08:15:11.430 回答
3

Java 支持两种类型的结构,第一是原语,第二是对象。

您要询问的方法用于将值从 Object 检索到原始值。

所有表示数字的 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();

于 2012-07-15T08:25:13.830 回答
2

考虑这个例子:

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()
于 2018-11-28T04:03:36.157 回答
1

get(i)将返回Integer对象并在您调用时获取其值intValue()。在第一种情况下,会自动auto-unboxing发生。

于 2012-07-15T08:13:36.663 回答
0

这只是从以下对象获取原始值的便捷方法:http Number: //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;
于 2012-07-15T08:17:05.880 回答
0

它们完全相同。正如其他海报所提到的,您可以将Integer对象或int原语放入数组中。在第一种情况下,编译器会自动将Integer对象转换为原语。这称为自动装箱。

于 2012-07-15T08:19:08.587 回答