您可以使用增强的for循环(aka foreach)或使用数组索引来遍历数组:
int[] array = new int[10]; // 使用索引:读写 for (int i = 0; i < array.length; i++) { array[i] = i; }
// 扩展为:只读 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; } }
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));
请记住,由于每次进入循环都会创建一个数组,因此该代码不应在对性能有严格要求的部分中使用,并且原始变量将被复制到该数组中,因此无法进行修改。