迭代数组

你可以使用增强型 for 循环(也称为 foreach)或使用数组索引来迭代数组:

int[] array = new int[10];

// using indices: read and write
for (int i = 0; i < array.length; i++) {
    array[i] = i;
}

Version >= Java SE 5

// extended for: read only
for (int e : array) {
    System.out.println(e);
}

值得注意的是,没有直接的方法在数组上使用 Iterator,但是通过 Arrays 库可以很容易地将其转换为列表以获取 Iterable 对象。

对于盒装数组,使用 Arrays.asList

Integer[] boxed = {1, 2, 3};
Iterable<Integer> boxedIt = Arrays.asList(boxed); // list-backed iterable
Iterator<Integer> fromBoxed1 = boxedIt.iterator();

对于基本阵列(用 java 8)使用流(特别是在该实施例中 - Arrays.stream - > IntStream ):

int[] primitives = {1, 2, 3};
IntStream primitiveStream = Arrays.stream(primitives); // list-backed iterable
PrimitiveIterator.OfInt fromPrimitive1 = primitiveStream.iterator();

如果你不能使用流(没有 java 8),你可以选择使用 google 的 guava 库:

Iterable<Integer> fromPrimitive2 = Ints.asList(primitives);

在二维阵列或更多阵列中,两种技术都可以以稍微复杂的方式使用。

例:

int[][] array = new int[10][10];

for (int indexOuter = 0; indexOuter < array.length; indexOuter++) {
    for (int indexInner = 0; indexInner < array[indexOuter].length; indexInner++) {
        array[indexOuter][indexInner] = indexOuter + indexInner;
    }
}

Version >= Java SE 5

for (int[] numbers : array) {
    for (int value : numbers) {
        System.out.println(value);
    }
}

如果不使用基于索引的循环,则无法将 Array 设置为任何非均匀值。

当然,在使用索引进行迭代时,你也可以使用 whiledo-while 循环。

需要注意的一点是: 使用数组索引时,请确保索引介于 0array.length - 1 之间(包括两者)。不要对数组长度进行硬编码假设,否则如果数组长度发生变化但你的硬编码值不会改变,则可能会破坏代码。

例:

int[] numbers = {1, 2, 3, 4};

public void incrementNumbers() {
    // DO THIS :
    for (int i = 0; i < numbers.length; i++) {
        numbers[i] += 1; //or this: numbers[i] = numbers[i] + 1; or numbers[i]++;      
    }
 
    // DON'T DO THIS :
    for (int i = 0; i < 4; i++) {
        numbers[i] += 1;
    }
}

如果你不使用花哨的计算来获取索引但是使用索引进行迭代并且如果你需要不同的值来计算它们,那也是最好的。

例:

public void fillArrayWithDoubleIndex(int[] array) {
    // DO THIS :
    for (int i = 0; i < array.length; i++) {
        array[i] = i * 2;
    }
 
    // DON'T DO THIS :
    int doubleLength = array.length * 2;
    for (int i = 0; i < doubleLength; i += 2) {
        array[i / 2] = i;
    }
}

以相反的顺序访问数组

int[] array = {0, 1, 1, 2, 3, 5, 8, 13};
for (int i = array.length - 1; i >= 0; i--) {
   System.out.println(array[i]);
}

使用临时数组来减少代码重复

迭代临时数组而不是重复代码可以使代码更清晰。它可用于对多个变量执行相同操作的情况。

// we want to print out all of these
String name = "Margaret";
int eyeCount = 16;
double height = 50.2;
int legs = 9;
int arms = 5;

// copy-paste approach:
System.out.println(name);
System.out.println(eyeCount);
System.out.println(height);
System.out.println(legs);
System.out.println(arms);

// temporary array approach:
for(Object attribute : new Object[]{name, eyeCount, height, legs, arms})
    System.out.println(attribute);

// using only numbers
for(double number : new double[]{eyeCount, legs, arms, height})
    System.out.println(Math.sqrt(number));

请记住,此代码不应用于性能关键部分,因为每次输入循环时都会创建一个数组,并且原始变量将被复制到数组中,因此无法修改。