JAVA 集合框架

552 查看

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异常。