Iterator接口是Collection接口的父接口。Collection接口下面包含List,Set,Queue等。
Map接口与Collection接口同级。但是Map接口并没有继承Iterator接口,因此无法迭代。
(分离出Iterator接口是迭代器(Iterator)模式)。但是Map接口又提供了 Set<Map.Entry<K, V>> entrySet()
接口以后将map转换成Set集合来迭代。Map集合是key-value形式。所以将一个键值对组合成一个Entry才能迭代。
JAVA的增强for循环也只适用于那些继承了Iterable接口的。没有实现这些接口的没法使用foreach(比如String)
通过分析字节码可以发现:
java
// Compiled from ArrayListTest.java (version 1.5 : 49.0, super bit) public class com.spring.ArrayListTest { // Method descriptor #6 ()V // Stack: 1, Locals: 1 public ArrayListTest(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [8] 4 return Line numbers: [pc: 0, line: 8] Local variable table: [pc: 0, pc: 5] local: this index: 0 type: com.spring.ArrayListTest // Method descriptor #15 ([Ljava/lang/String;)V // Stack: 2, Locals: 4 public static void main(java.lang.String[] args); 0 new java.util.ArrayList [16] 3 dup 4 invokespecial java.util.ArrayList() [18] 7 astore_1 [arrayList] 8 aload_1 [arrayList] 9 ldc <String "1"> [19] 11 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [21] 14 pop 15 aload_1 [arrayList] 16 ldc <String "2"> [25] 18 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [21] 21 pop 22 aload_1 [arrayList] 23 ldc <String "3"> [27] 25 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [21] 28 pop 29 aload_1 [arrayList] 30 ldc <String "4"> [29] 32 invokevirtual java.util.ArrayList.add(java.lang.Object) : boolean [21] 35 pop 36 aload_1 [arrayList] 37 invokevirtual java.util.ArrayList.iterator() : java.util.Iterator [31] 40 astore_3 41 goto 60 44 aload_3 45 invokeinterface java.util.Iterator.next() : java.lang.Object [35] [nargs: 1] 50 checkcast java.lang.String [41] 53 astore_2 [string] 54 aload_1 [arrayList] 55 aload_2 [string] 56 invokevirtual java.util.ArrayList.remove(java.lang.Object) : boolean [43] 59 pop 60 aload_3 61 invokeinterface java.util.Iterator.hasNext() : boolean [46] [nargs: 1] 66 ifne 44 69 return Line numbers: [pc: 0, line: 14] [pc: 8, line: 15] [pc: 15, line: 16] [pc: 22, line: 17] [pc: 29, line: 18] [pc: 36, line: 19] [pc: 54, line: 20] [pc: 60, line: 19] [pc: 69, line: 24] Local variable table: [pc: 0, pc: 70] local: args index: 0 type: java.lang.String[] [pc: 8, pc: 70] local: arrayList index: 1 type: java.util.ArrayList [pc: 54, pc: 60] local: string index: 2 type: java.lang.String Local variable type table: [pc: 8, pc: 70] local: arrayList index: 1 type: java.util.ArrayList<java.lang.String> }
增强for循环就是使用的迭代器来循环。
在迭代的过程中间如果修改集合本身导致了集合size发生变化,将会抛出java.util.ConcurrentModificationException
异常。