在JDK1.5之前, Collection 接口中就定义有 iterator() 方法, 通过此方法可以取得 Iterator接口的实例化对象, 而在 JDK1.5 之后, 将此方法提升为 Iterable 接口中的方法, 但是不管你如何提升, 必须清楚 Collection 有这个方法, 那么 List, Set 一定有此方法.
对于 Iterator 接口最初的设计, 里面实际上有三个抽象方法:
default
void remove() ; 此方法从 JDK1.8 开始变成一个 default 的完整的方法了package com.beyond.nothing;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class test {
public static void main(String[] args) {
List<String> all = new ArrayList<String>();
all.add("Hello");
all.add("Hello");
all.add("World");
Iterator<String> iter = all.iterator(); // 实例化 Iterator接口对象
while (iter.hasNext()){
String str = iter.next();
System.out.println(str);
}
}
}
对于 Iterator 接口中提供的 remove() 方法, 主要解决的就是集合内容的删除操作(真没什么用).
package com.beyond.nothing;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class test {
public static void main(String[] args) {
List<String> all = new ArrayList<String>();
all.add("Hello");
all.add("Hello");
all.add("o");
all.add("World");
Iterator<String> iter = all.iterator(); // 实例化 Iterator接口对象
while (iter.hasNext()) {
String str = iter.next();
if ("o".equals(str)){
// all.remove("o"); // 如果使用此操作, 则删除了 后面被中断执行
iter.remove(); // 删除后, 代码可以继续执行
continue;
}
System.out.println(str);
}
}
}
集合的核心功能在于数据的增加和数据的取出, 所以对于这种删除的操作根本没有意义, 开发中可能使用到的机率为 0;
以后见到了结合输出的问题, 不需要思考直接使用 Iterator 接口
Iterator 输出接口有一个特点: 只能够由前先后进行内容的迭代处理, 而如果要进行双向迭代, 那么就必须依靠 Iterator 的子接口 ListIterator 来实现.
首先来观察一下此接口定义的方法:
Iterator 接口的对象是由 Collection 接口支持的, 但是 ListIterator 是由 List 接口支持的
List 接口提供有如下方法:
取得ListIterator 接口对象 : public ListIterator
package com.beyond.nothing;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class test {
public static void main(String[] args) {
List<String> all = new ArrayList<String>();
all.add("Hello");
all.add("Hello");
all.add("o");
all.add("World");
ListIterator<String> iter = all.listIterator();
System.out.println("从前向后输出!");
while (iter.hasNext()) {
System.out.print(iter.next() + ",");
}
System.out.println("\n从后向前输出!");
while (iter.hasPrevious()) {
System.out.print(iter.previous() + ",");
}
}
}
如果要实现有后向前的输出, 那么应该首先进行有前到后的输出, 否则无法实现双向.
在 JDK 1.0 的时候就引入了 Enumeration 输出接口, 而在 JDK 1.5 的时候也针对其也做了更正, 主要是追加了其对泛型的应用.
首先来观察 Enumeration 接口定义:
重点重点重点
重点重点重点
public Enumeration elements()
package com.beyond.nothing;
import java.util.*;
public class test {
public static void main(String[] args) {
Vector<String> all = new Vector<String>();
all.add("Hello");
all.add("Hello");
all.add("o");
all.add("World");
Enumeration<String> enu = all.elements();
while (enu.hasMoreElements()){
System.out.println(enu.nextElement());
}
}
}
从JDK 1.5 开始 foreach可以输出数组, 实际上除了数组之外, 还可以输出集合操作, 不过对于初学者而言不建议这样处理.
package com.beyond.nothing;
import java.util.*;
public class test {
public static void main(String[] args) {
Vector<String> all = new Vector<String>();
all.add("Hello");
all.add("Hello");
all.add("o");
all.add("World");
for (String str : all) {
System.out.println(str);
}
}
}
如果从代码的本质上来讲,此处是少了一个对象, 但是 Iterator 只是一个输出对象, 而所有的内容都是在集合本身, 所以这个输出对象所占用的空间不算什么.