本文总结自: https://www.cnblogs.com/hellochennan/p/5373186.html
1. 传统方式
非常简单的for循环
int[] a = {1, 2, 3, 4}; for (int j = 0; j < a.length; j++) { int i = a[j]; System.out.println(i); }
2. for-each循环(J2SE 1.5)
语法: for (循环变量类型 循环变量名称 : 被遍历的对象) 循环体
eg:
int[] a = {1, 2, 3, 4};for (int i : a) { System.out.println(i); }
为什么不用foreach和in,而是for、: ?
这是为了避免因为引入新的关键字,造成兼容性方面的问题。
如何防止在循环体中修改循环变量?
可通过将循环变量设为final,这样如果对其进行修改会在编译时报错
int[] a = {1, 2, 3, 4}; for (final int i : a) { i = i / 2; /* 编译时出错 */ }
注意: 只是禁止了对循环变量直接赋值。如果给循环变量的属性赋值,或者调用能让循环变量的属性变化的方法,是不被禁止的。
----------------------------------------------------------------------------------------------------------------
类型相容问题
a、循环变量的类型可以是被遍历的对象的上级类型
eg:
String[] strings = {"A", "B", "C", "D"};Collection< String> list = java.util.Arrays.asList(strings);for (Object str : list) {System.out.println(str);/* 依次输出“A”、“B”、“C”、“D” */}
b、循环变量的类型可以和要被遍历的对象的类型之间存在能自动转换的关系,即:
J2SE 1.5中包含了“Autoboxing/Auto-Unboxing”的机制,允许编译器在必要的时候,自动在基本类型和它们的包裹类(Wrapper Classes)之间进行转换。
eg:
int[] integers = {1, 2, 3, 4};for (Integer i : integers) { System.out.println(i); /* 依次输出“1”、“2”、“3”、“4” */}
---------------------------------------------------------------------------------------------------------------------------------------------
3. 转换为Collection子类用迭代器遍历
eg:
int[] a= {1,2,3};List b= a.AsList(a); Iterator iter= b.iterator();while(iter.hasNext()){ Object pre= iter.next(); System.out.println(pre);} 或
int[] a= {1,2,3}; List b= a.AsList(a); for(Iterator iter = b.iterator();iter.hasNext();){ Object pre= iter.next(); System.out.println(pre); }
Collection子类也能使用for-each的方式遍历,即:
int[] a= {1,2,3};List b= a.AsList(a);for(Object i: b){ System.out.println(i);}
---------------------------------------------------------------------------------------------------------------------------------------------