使用增强型for循环时是否正在转换数组?

时间:2011-06-02 15:36:30

标签: java arrays unboxing

Java 5或更高版本是否会对数组应用某种形式的“装箱”?这个问题浮现在脑海中,因为下面的代码通过一个数组,好像它是一个Iterable。

for( String : args ){
// Do stuff
}

4 个答案:

答案 0 :(得分:5)

数组不是原语。基元是不是对象的东西。只有boolean,char,byte,short,int,long,float和double才是原语。 Arrays是具有特殊语法的对象。如果你可以在Java中调用toString()类型< 5它不是原始的。

所有自动装箱都是将原语转换为/来自期望诸如ArrayList之类对象的对象。它允许代码如下:

List<Integer> l = new ArrayList<Integer>();
l.add( 7 );
int i = l.get(0);

成为简称:

List<Integer> l = new ArrayList<Integer>();
Integer ii = Integer.valueOf( 7 )
l.add( ii );
int i = l.get(0).getIntValue();

这就是所有自动装箱。由于String已经是一个对象(并且不像C语言中那样等效于char []),因此没有任何内容可以将/ unbox String转换为。


编辑:添加了布尔值

答案 1 :(得分:3)

由于您似乎特别想知道增强的for循环,答案是它们是特殊的,而不是未装箱的。来自§14.14.2

  

增强的for语句具有以下形式:

EnhancedForStatement:
    for ( VariableModifiersopt Type Identifier: Expression) Statement
     

Expression必须具有Iterable类型,否则它必须是数组类型(第10.1节),否则会发生编译时错误。

实际上,如果表达式是一个数组,它将被转换为等效的索引for循环,而不是实际使用迭代器。精确的扩展包含在语言规范的同一部分中。

答案 2 :(得分:2)

不,数组总是引用类型。除非它在每个元素的访问权限上,否则不需要装箱或拆箱。例如:

int[] x = new int[10]; // The value of x is a reference

int y = x[0]; // No boxing
Integer z = x[1]; // Boxing conversion from x[1] (which is an int) to Integer

另请注意,尽管增强的for循环可用于数组和迭代,但每个数组的编译方式都不同。

有关增强型for循环的两种不同翻译,请参阅JLS的section 14.14.2

答案 3 :(得分:1)

没有

与基元不同,数组(和字符串)是Object s。