集合输出
集合输出实际上从JDK1.8开始就在Iterable接口之中提供有一个 forEach()方法,这种输出形式并不是传统输出,也很难在开发中出现。
对于集合有四种输出形式:Iterator迭代输出 , ListIterator双向迭代输出 , Enumeration枚举输出 , foreach输出
1、Iterator迭代输出
JDK1.5之后Collection中多继承了一个Iterable父接口,其中出现了iterator()方法,可以获取Iterator接口对象(JDK1.5之前该方法在Collection接口中)
Iterator定义:
public interface Iterator<E>
- 获取Iterator接口对象:Iterator iterator()
Iterator接口中定义方法:
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | boolean hasNext() | 普通 | 判断是否有数据 |
2 | E next() | 普通 | 取出当前数据 |
3 | default void remove() | 普通 | 删除 |
使用Iterator输出
public class JavaDemo {
public static void main(String[] args) throws Exception {
Set<String> set = Set.of("Hello" , "World" , "!");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
在Collection中也定义有remove()方法,如果在进行迭代输出时使用了Collection中的remove()方法,会导致迭代失败。
因此如果需要删除,只能使用Iterator中提供的remove()方法(非必须情况下,尽量不使用Iterator中的remove()方法)
面试题:请解释Collection.remove()与Iterator.remove()的区别?
- 在进行迭代输出的时候如果使用了Collection.remove()则会造成并发更新异常,此时只能利用Iterator.remove()实现正常删除
2、ListIterator双向迭代输出
使用Iterator进行迭代输出有一个特点:只允许有前向后输出
如果要双向迭代处理,必须依靠Listlterator接口
Collection中没有定义获取ListIterator接口对象的方法,但是List中有,所以ListIterator接口是专门为List集合准备的
ListIterator定义如下方法:
- 判断是否有前一个元素:boolean hasPrevious()
- 获取当前元素:E previous()
实现双向迭代
public class JavaDemo {
public static void main(String[] args) throws Exception {
ArrayList<String> list= new ArrayList<>();
list.add("Hello");
list.add("World");
list.add("!");
ListIterator<String> iterator = list.listIterator();
System.out.print("由前向后输出:");
while (iterator.hasNext()) {
System.out.print(iterator.next());
}
System.out.println();
System.out.print("由后向前输出:");
while (iterator.hasPrevious()) {
System.out.print(iterator.previous());
}
}
}
//由前向后输出:HelloWorld!
//由后向前输出:!WorldHello
如果要实现由后向前的遍历,首先要实现由前向后遍历
3、Enumeration枚举输出
Enumeration只为Vector一个类提供服务,要想获取Enumeration接口对象,只能依靠Vector类中提供的方法
- 获取Enumeration:public Enumeration elements()
Enumeration中定义有两个操作方法:
- 判断是否有下一个元素:boolean hasMoreElements()
- 获取当前元素:E nextElement()
使用Enumeration实现输出
public class JavaDemo {
public static void main(String[] args) throws Exception {
Vector<String> list= new Vector<>();
list.add("Hello");
list.add("World");
list.add("!");
Enumeration<String> enu = list.elements();
while (enu.hasMoreElements()) {
System.out.println(enu.nextElement());
}
}
}
4、foreach输出
使用foreach输出
public class JavaDemo {
public static void main(String[] args) throws Exception {
List<String> list= new ArrayList<>();
list.add("Hello");
list.add("World");
list.add("!");
for (String str : list) {
System.out.println(str);
}
}
}