Java遍历数组

示例

您可以使用增强的for循环(aka foreach)或使用数组索引来遍历数组:

int[] array = new int[10];

// 使用索引:读写
for (int i = 0; i < array.length; i++) {
    array[i] = i;
}

Java SE 5
// 扩展为:只读
for (int e : array) {
    System.out.println(e);
}

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

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

Integer[] boxed = {1, 2, 3};
Iterable<Integer> boxedIt = Arrays.asList(boxed); // 列表支持的可迭代
Iterator<Integer> fromBoxed1 = boxedIt.iterator();

对于原始数组(使用Java 8),请使用流(在此示例中特别是Arrays.stream--> IntStream):

int[] primitives = {1, 2, 3};
IntStream primitiveStream = Arrays.stream(primitives); // 列表支持的可迭代
PrimitiveIterator.OfInt fromPrimitive1 = primitiveStream.iterator();

如果您不能使用流(没有Java 8),则可以选择使用Google的番石榴库:

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;
    }
}

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

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

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

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

例:

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

public void incrementNumbers() {
    // 做这个 :
    for (int i = 0; i < numbers.length; i++) {
        numbers[i] += 1; //或这样:数字[i] =数字[i] +1;或数字[i] ++;      
    }
 
    // 不要这样做:
    for (int i = 0; i < 4; i++) {
        numbers[i] += 1;
    }
}


如果不使用复杂的计算来获取索引,而是使用索引进行迭代,并且如果需要不同的值来计算,那也是最好的选择。

例:

public void fillArrayWithDoubleIndex(int[] array) {
    // 做这个 :
    for (int i = 0; i < array.length; i++) {
        array[i] = i * 2;
    }
 
    // 不要这样做:
    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]);
}

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

遍历临时数组而不是重复代码可以使代码更整洁。它可以在对多个变量执行相同操作的情况下使用。

// 我们要打印所有这些
String name = "Margaret";
int eyeCount = 16;
double height = 50.2;
int legs = 9;
int arms = 5;


// 复制粘贴方法:
System.out.println(name);
System.out.println(eyeCount);
System.out.println(height);
System.out.println(legs);
System.out.println(arms);


// 临时数组方法:
for(Object attribute : new Object[]{name, eyeCount, height, legs, arms})
    System.out.println(attribute);

// 仅使用数字
for(double number : new double[]{eyeCount, legs, arms, height})
    System.out.println(Math.sqrt(number));

请记住,由于每次进入循环都会创建一个数组,因此该代码不应在对性能有严格要求的部分中使用,并且原始变量将被复制到该数组中,因此无法进行修改。