对于操作而言,一共有四种输出形式:Iterator
迭代输出、ListIterator
双向迭代输出、Eumeration
枚举输出、foreach
输出.
文档地址:https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/Iterator.html
1、Iterator
迭代输出
- 获取
Iterator
接口对象:public Iterator<T> iterator()
;
在Iterator
接口里面有如下定义: - 判断是否有数据:
public boolean hasNext()
- 取出当前数据:
public E next()
- 删除:
public default void remove()
在之前使用的java.util.Scanner类就说Iterator接口的子类,此时类继承关系如下: - 【范例】使用Iterator输出
package demo;
import java.util.Iterator;
import java.util.Set;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
//进行Set集合数据的保存,并且设置有重复的内容
Set<String> all = Set.of("Hello","World","!!!","memeda");
Iterator<String> iter = all.iterator();//实例化Iterator对象
while(iter.hasNext()) {
String str = iter.next();
System.out.println(str);
}
}
}
对于Iterator中的remove()方法需要特别注意,如果不是必须不要使用。
实际上Collection方法中定义有数据的删除方法,但是如果在进行迭代输出的过程中如果使用了Collection中的remove()方法会导致迭代失败。
【采用Collection中的remove()方法删除】
package demo;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
//进行Set集合数据的保存,并且设置有重复的内容
Set<String> all = new HashSet<String>();
all.add("Hello");
all.add("World");
all.add("!!!!");
all.add("么么么哒");
Iterator<String> iter = all.iterator();//实例化Iterator对象
while(iter.hasNext()) {
String str = iter.next();
if("World".equals(str)) {
all.remove("World");
}
System.out.println(str);
}
}
}
会报错Exception in thread “main” java.util.ConcurrentModificationException。
此时无法进行数据的删除处理操作,那么此时就只能够利用Iterator接口中的remove()方法进行删除。
【范例】使用Iterator接口删除方法
package demo;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
//进行Set集合数据的保存,并且设置有重复的内容
Set<String> all = new HashSet<String>();
all.add("Hello");
all.add("World");
all.add("!!!!");
all.add("么么么哒");
Iterator<String> iter = all.iterator();//实例化Iterator对象
while(iter.hasNext()) {
String str = iter.next();
if("World".equals(str)) {
iter.remove();//删除当前的数据
}
// System.out.println(str);
}
all.forEach(System.out::println);
}
}
Hello
!!!!
么么么哒
Collection.remove()与Iterator.remove()的区别:
- 在进行迭代输出的时候如果使用了Collection.remove()则会造成并发更新异常,导致程序删除出错,而此时只能够利用Iterator.remove()方法实现正常的删除处理。
2、ListIterator输出
使用Iterator进行的迭代输出操作有一个特点:只允许由前向后实现输出,而如果要实现双向输出操作处理,则必须依靠ListIterator接口来实现。
在ListIterator
接口里面定义有如下的操作放啊:
- 判断是否有前一个元素:
public boolean hasPrevious()
; - 获取当前元素:
public E previous()
;
【范例】实现双向迭代
package demo;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
List<String> all = new ArrayList<String>();
all.add("Hello");
all.add("world");
all.add("!!!!");
all.add("dingding");
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()+"、");
}
}
}
由前向后输出:
Hello、world、!!!!、dingding、
由后向前输出
dingding、!!!!、world、Hello、
如果要想实现由后向前的遍历,那么首先要实现的时由前向后实现遍历处理。
Enumeration输出
Enumeration只为Vector一个类服务,如果要想获取Enumeration接口对象,就必须依靠Vector类提供的方法:
- 获取Enumeration:
public Enumeration<E> elements()
;
在Enumeration接口之中定义有两个接口方法: - 判断是否有下一个元素:
public boolean hasMoreElements()
; - 获取当前元素:
public E nextElement()
。
【范例】使用Enumeration进行输出
package demo;
import java.util.Enumeration;
import java.util.Vector;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Vector<String> all = new Vector<String>();
all.add("Hello");
all.add("world");
all.add("!!!!");
all.add("dingding");
Enumeration<String> enu = all.elements();
while (enu.hasMoreElements()) {
String str = enu.nextElement();
System.out.println(str +"、");
}
}
}
Hello、
world、
!!!!、
dingding、