文章目录
- 1. 迭代输出 : Iterator (95%)
- 案例: 标准的 Iterator 使用
- 案例: 删除元素
- `以后见到了结合输出的问题, 不需要思考直接使用 Iterator 接口`
- 2. ListIterator 双向迭代接口 (0.01%)
- 观察 ListIterator 接口的使用
- 3. Enumeration 枚举输出 (4.8 %)
- ==但是要如果取得这个接口的实例化对象, 是不可能依靠 Collection, List, Set 等接口的, 只能够依靠 Vector 子类, 因为 Enumeration 最早就是为 Vector 设计服务的== 在Vector 类中提供有一个取得 Enumeration 对象的方法 : `public Enumeration elements() `
- 范例: 使用 Enumeration 输出 :
- 一些操作的类库上, 依然只支持 Enumeration, 而不支持 Iterator, 虽然很少, 但是开发中会使用到.
- 4. 新的输出: foreach (0.1 %)
- 范例: 直接使用 foreach 输出
- 总结:
在之前使用集合输出的时候都利用了toString(), 或者是利用了List接口中的get()方法, 但是这些都不是集合的标准的输出模式.
如果从标准上说, 集合的输出一共有四种手段
- Iterator (核心)
- ListIterator
- Enumeration
- foreach
1. 迭代输出 : Iterator (95%)
在JDK1.5之前, Collection 接口中就定义有 iterator() 方法, 通过此方法可以取得 Iterator接口的实例化对象, 而在 JDK1.5 之后, 将此方法提升为 Iterable 接口中的方法, 但是不管你如何提升, 必须清楚 Collection 有这个方法, 那么 List, Set 一定有此方法.
对于 Iterator 接口最初的设计, 里面实际上有三个抽象方法:
- 判断是否有下一个元素: public boolean hasNext() ;
- 取得当前的一个元素: public E next() ;
- 删除元素: public
default
void remove() ; 此方法从 JDK1.8 开始变成一个 default 的完整的方法了
案例: 标准的 Iterator 使用
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 接口
2. ListIterator 双向迭代接口 (0.01%)
Iterator 输出接口有一个特点: 只能够由前先后进行内容的迭代处理, 而如果要进行双向迭代, 那么就必须依靠 Iterator 的子接口 ListIterator 来实现.
首先来观察一下此接口定义的方法:
- 判断是否有上一个元素: public boolean hasPrevious() ;
- 取得当前元素 : public E previous() ;
Iterator 接口的对象是由 Collection 接口支持的, 但是 ListIterator 是由 List 接口支持的
List 接口提供有如下方法:
取得ListIterator 接口对象 : public ListIterator<E> listIterator() ;
观察 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() + ",");
}
}
}
如果要实现有后向前的输出, 那么应该首先进行有前到后的输出, 否则无法实现双向.
3. Enumeration 枚举输出 (4.8 %)
在 JDK 1.0 的时候就引入了 Enumeration 输出接口, 而在 JDK 1.5 的时候也针对其也做了更正, 主要是追加了其对泛型的应用.
首先来观察 Enumeration 接口定义:
- 判断是否有下一个元素: public boolean hasMoreElements()
重点重点重点
- 取得元素: public E nextElement() ;
重点重点重点
但是要如果取得这个接口的实例化对象, 是不可能依靠 Collection, List, Set 等接口的, 只能够依靠 Vector 子类, 因为 Enumeration 最早就是为 Vector 设计服务的 在Vector 类中提供有一个取得 Enumeration 对象的方法 :public Enumeration elements()
范例: 使用 Enumeration 输出 :
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());
}
}
}
一些操作的类库上, 依然只支持 Enumeration, 而不支持 Iterator, 虽然很少, 但是开发中会使用到.
4. 新的输出: foreach (0.1 %)
从JDK 1.5 开始 foreach可以输出数组, 实际上除了数组之外, 还可以输出集合操作, 不过对于初学者而言不建议这样处理.
范例: 直接使用 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 只是一个输出对象, 而所有的内容都是在集合本身, 所以这个输出对象所占用的空间不算什么.
总结:
- 看见集合输出就使用 Iterator 就行了
- Iterator 和 Enumeration 接口中的方法一定要掌握牢固.