|
7 | 7 |
|
8 | 8 | ```java
|
9 | 9 | public Iterator<E> {
|
10 |
| - boolean hasNext(); // 如果迭代有更多元素,则返回true |
11 |
| - E next(); // 返回迭代中的下一个元素 |
12 |
| - void remove(); // 删除迭代器返回的最后一个元素 |
| 10 | +boolean hasNext(); // 如果迭代有更多元素,则返回true |
| 11 | +E next(); // 返回迭代中的下一个元素 |
| 12 | +void remove(); // 删除迭代器返回的最后一个元素 |
13 | 13 | }
|
14 | 14 | ```
|
15 | 15 |
|
16 |
| -迭代器的目的是提供一种统一访问集合元素的方法,因此无论您处理什么类型的集合,并且实现它们,您总是会知道如何依次处理元素。 这曾经需要一些相当笨拙的代码; 例如,在较早版本的 `Java` 中,您可以编写以下内容来打印集合内容的字符串表示形式: |
| 16 | +迭代器的目的是提供一种统一访问集合元素的方法,因此无论您处理什么类型的集合,并且实现它们,您总是会知道如何依次处理元素。 这曾经需要一些相当笨拙的代 |
| 17 | +码; 例如,在较早版本的 `Java` 中,您可以编写以下内容来打印集合内容的字符串表示形式: |
17 | 18 |
|
18 | 19 | ```java
|
19 |
| - // coll是指实现Collection的对象 |
20 |
| - // ----- 不是Java 5的首选成语 ------- |
21 |
| - for (Iterator itr = coll.iterator() ; itr.hasNext() ; ) { |
22 |
| - System.out.println(itr.next()); |
23 |
| - } |
| 20 | +// coll是指实现Collection的对象 |
| 21 | +// ----- 不是Java 5的首选成语 ------- |
| 22 | +for (Iterator itr = coll.iterator() ; itr.hasNext() ; ) { |
| 23 | + System.out.println(itr.next()); |
| 24 | +} |
24 | 25 | ```
|
25 | 26 |
|
26 |
| -这个奇怪的声明是 `Java 5` 之前的首选语言,因为通过将itr的范围限制在循环体中,它消除了在其他地方意外使用它的可能性。 这段代码的工作原理是任何实现 `Collection` 的类都有一个迭代器方法,该方法返回适合于该类对象的迭代器。 它已不再是已批准的惯用语,因为 `Java 5` 引入了更好的东西:`foreach` 语句,您在第I部分中遇到了。使用`foreach`,我们可以更简洁地编写前面的代码: |
| 27 | +这个奇怪的声明是 `Java 5` 之前的首选语言,因为通过将itr的范围限制在循环体中,它消除了在其他地方意外使用它的可能性。 这段代码的工作原理是任何实现 |
| 28 | +`Collection` 的类都有一个迭代器方法,该方法返回适合于该类对象的迭代器。 它已不再是已批准的惯用语,因为 `Java 5` 引入了更好的东西:`foreach` 语句, |
| 29 | +您在第I部分中遇到了。使用`foreach`,我们可以更简洁地编写前面的代码: |
27 | 30 |
|
28 | 31 | ```java
|
29 |
| - for (Object o : coll) { |
30 |
| - System.out.println(o); |
31 |
| - } |
| 32 | +for (Object o : coll) { |
| 33 | + System.out.println(o); |
| 34 | +} |
32 | 35 | ```
|
33 | 36 |
|
34 | 37 | 这段代码可以与任何实现接口 `Iterable` 的任何东西一起工作 - 也就是说任何可以产生 `Iterator` 的东西。 这是 `Iterable` 的声明:
|
35 | 38 |
|
36 | 39 | ```java
|
37 |
| - public Iterable<T> { |
38 |
| - Iterator<T> iterator(); // 在类型T的元素上返回一个迭代器 |
39 |
| - } |
| 40 | +public Iterable<T> { |
| 41 | + Iterator<T> iterator(); // 在类型T的元素上返回一个迭代器 |
| 42 | +} |
40 | 43 | ```
|
41 | 44 |
|
42 |
| -在 `Java 5` 中,`Collection` 接口用于扩展 `Iterable`,所以任何 `set`,`list` 或 `queue` 都可以成为 `foreach` 的目标,就像数组一样。 如果您编写自己的 `Iterable` 实现,那么也可以使用 `foreach`。 例 `11-1` 给出了 `Iterable` 如何直接实现的一个小例子。 `Counter` 对象用 `Integer` 对象的计数进行初始化; 它的迭代器以响应 `next()` 的调用的升序返回这些值。 |
| 45 | +在 `Java 5` 中,`Collection` 接口用于扩展 `Iterable`,所以任何 `set`,`list` 或 `queue` 都可以成为 `foreach` 的目标,就像数组一样。 如果您编写 |
| 46 | +自己的 `Iterable` 实现,那么也可以使用 `foreach`。 例 `11-1` 给出了 `Iterable` 如何直接实现的一个小例子。 `Counter` 对象用 `Integer` 对象的计数 |
| 47 | +进行初始化; 它的迭代器以响应 `next()` 的调用的升序返回这些值。 |
43 | 48 |
|
44 | 49 | 现在,`Counter` 对象可以成为 `foreach` 语句的目标:
|
45 | 50 |
|
46 | 51 | ```java
|
47 |
| - int total = 0; |
48 |
| - for (int i : new Counter(3)) { |
49 |
| - total += i; |
50 |
| - } |
51 |
| - assert total == 6; |
| 52 | +int total = 0; |
| 53 | +for (int i : new Counter(3)) { |
| 54 | + total += i; |
| 55 | +} |
| 56 | +assert total == 6; |
52 | 57 | ```
|
53 | 58 |
|
54 | 59 | 在实践中,以这种方式直接实现 `Iterable` 是很不寻常的,因为 `foreach` 最常用于数组和标准集合类。
|
55 | 60 |
|
56 |
| -框架-`ArrayList`,`HashMap` 等通用集合的迭代器可以通过从单线程代码抛出 `ConcurrentModificationException` 来困扰新手用户。当这些迭代器检测到它们派生的集合已经在结构上发生了变化(广义地说,这些元素已被添加或删除)时,这些迭代器会抛出此异常。这种行为的动机是迭代器被实现为其底层集合的视图,因此,如果该集合在结构上发生了变化,则迭代器可能无法在到达集合的已更改部分时继续正常运行。通用集合框架迭代器可以快速失败,而不会让失败的表现延迟,使诊断变得困难。快速迭代器的方法检查自上次迭代器方法调用后,底层集合没有被结构性更改(由另一个迭代器或集合本身的方法)。如果他们检测到更改,则会抛出 `ConcurrentModificationException`。虽然这个限制排除了一些合理的程序,但它排除了更多不合适的程序。 |
| 61 | +框架-`ArrayList`,`HashMap` 等通用集合的迭代器可以通过从单线程代码抛出 `ConcurrentModificationException` 来困扰新手用户。当这些迭代器检测到它们 |
| 62 | +派生的集合已经在结构上发生了变化(广义地说,这些元素已被添加或删除)时,这些迭代器会抛出此异常。这种行为的动机是迭代器被实现为其底层集合的视图,因 |
| 63 | +此,如果该集合在结构上发生了变化,则迭代器可能无法在到达集合的已更改部分时继续正常运行。通用集合框架迭代器可以快速失败,而不会让失败的表现延迟,使诊 |
| 64 | +断变得困难。快速迭代器的方法检查自上次迭代器方法调用后,底层集合没有被结构性更改(由另一个迭代器或集合本身的方法)。如果他们检测到更改,则会抛出 |
| 65 | +`ConcurrentModificationException`。虽然这个限制排除了一些合理的程序,但它排除了更多不合适的程序。 |
57 | 66 |
|
58 | 67 | 例11-1。直接实现 `Iterable`
|
59 | 68 |
|
60 | 69 | ```java
|
61 |
| - class Counter implements Iterable<Integer> { |
62 |
| - private int count; |
63 |
| - public Counter(int count) { this.count = count; } |
64 |
| - public Iterator<Integer> iterator() { |
65 |
| - return new Iterator<Integer>() { |
66 |
| - private int i = 0; |
67 |
| - public boolean hasNext() { return i < count; } |
68 |
| - public Integer next() { i++; return i; } |
69 |
| - public void remove(){ |
70 |
| - throw new UnsupportedOperationException(); |
71 |
| - } |
72 |
| - }; |
73 |
| - } |
74 |
| - } |
| 70 | +class Counter implements Iterable<Integer> { |
| 71 | + private int count; |
| 72 | + public Counter(int count) { |
| 73 | + this.count = count; |
| 74 | + } |
| 75 | + public Iterator<Integer> iterator() { |
| 76 | + return new Iterator<Integer>() { |
| 77 | + private int i = 0; |
| 78 | + public boolean hasNext() { |
| 79 | + return i < count; |
| 80 | + } |
| 81 | + public Integer next() { |
| 82 | + i++; |
| 83 | + return i; |
| 84 | + } |
| 85 | + public void remove(){ |
| 86 | + throw new UnsupportedOperationException(); |
| 87 | + } |
| 88 | + }; |
| 89 | + } |
| 90 | +} |
75 | 91 | ```
|
76 | 92 |
|
77 | 93 | 并发集合有处理并发修改的其他策略,例如弱一致的迭代器。 我们在第 `11.5` 节更详细地讨论它们。
|
78 | 94 |
|
79 | 95 | 《《《 [下一节](02_Implementations.md) <br/>
|
80 |
| -《《《 [返回首页](../README.md) |
| 96 | +《《《 [返回首页](../README.md) |
0 commit comments