1

Java 5 或更高版本是否对数组应用某种形式的“装箱”?当以下代码像 Iterable 一样遍历数组时,我想到了这个问题。

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

4 回答 4

5

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

自动装箱所做的就是将原语转换为期望对象的对象,例如 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[] 不同),因此无需将 String 装箱/拆箱。


编辑:如上所述添加布尔值

于 2011-06-02T15:38:38.550 回答
3

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

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

EnhancedForStatement:
    for ( VariableModifiersopt Type Identifier: Expression) Statement

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

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

于 2011-06-02T15:40:30.983 回答
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 的第 14.14.2 节。

于 2011-06-02T15:38:00.890 回答
1

不。

与原语不同,数组(和字符串)是Objects。

于 2011-06-02T15:37:51.890 回答