集合输出
在Java中,集合的输出操作有四种形式:Iterator输出、ListIterator输出、foreach(加强型for循环)输出、Enumeration输出。
迭代输出:Iterator
Iterator(迭代器)是集合输出操作中最常用的接口,而在Collection接口中也提供了直接为Iterator接口实例化的方法(iterator()),所以任何集合类型都可以转换为Iterator接口输出。
在Iterator接口中一共定义了两个抽象方法,如下所示:
No. | 方法 | 类型 | 描述 |
1 | public boolean hasNext() | 普通 | 判断是否还有内容 |
2 | public E next() | 普通 | 取出当前内容 |
当使用Iterator接口输出内容时,往往都先利用hasNext()改变指针位置,同时判断是否有数据,如果当前指针所在位置存在数据,则利用next()取出数据。
事实上之前我们讲的Scanner类就是Iterator接口的子类,所以在Scanner使用时才要求先利用hasNextXxx()判断是否有数据,在利用nextXxx()取得数据。
例:使用Iterator输出集合
package Project.Study.IteratorClass;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test1 {
public static void main(String[]args){
List<String>all = new ArrayList<>(); //实例化List集合
all.add("Hello"); //保存数据
all.add("Hello"); //保存重复数据
all.add("World");
all.add("!!!");
Iterator<String> iter = all.iterator(); //实例化Iterator接口
while(iter.hasNext()){ //判断当前是否还有数据
String str = iter.next(); //取出当前数据
System.out.println(str); //输出数据
}
}
}
//结果:
//Hello
//Hello
//World
//!!!
双向迭代:ListIterator
Iterator接口虽然可以实现集合的迭代输出操作,但他本身存在一个问题:只能进行由前向后的输出。所以为了让输出更灵活,在类集框架中提供了一个ListIterator接口,利用该接口可以实现双向迭代,他属于Iterator的子接口,常用方法如下:
No. | 方法 | 类型 | 描述 |
1 | public boolean hasPrevious() | 普通 | 判断是否有前一个元素 |
2 | public E previous() | 普通 | 取出前一个元素 |
3 | public void add(E e) | 普通 | 向集合追加数据 |
4 | public void set(E e) | 普通 | 修改集合数据 |
ListIterator是专门为List子接口定义的输出接口,所以ListIterator接口对象的实例化可以依靠List接口提供的方法:
public ListIterator< E > listIterator()。
例:完成双向迭代
package Project.Study.ListIteratorClass;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Test1 {
public static void main(String[]args){
List<String>all = new ArrayList<>(); //实例化List接口对象
all.add("Hello"); //向集合里面保存数据
all.add("World");
all.add("Hello");
all.add("!!!");
System.out.println("由前向后输出:");
ListIterator<String>iter = all.listIterator(); //实例化ListIterator接口
while(iter.hasNext()){ //由前向后迭代
String str = iter.next(); //取出当前数据
System.out.println(str+"、"); //输出数据
}
System.out.println("由后向前输出:");
while(iter.hasPrevious()){ //由后向前迭代
String str = iter.previous();
System.out.println(str+"、");
}
}
}
//结果:
//由前向后输出:
//Hello、World、Hello、!!!、
//由后向前输出:
//!!!、Hello、World、Hello、
注意:ListIterator接口需要注意迭代顺序,如果要进行由后向前迭代,必须先进行由前向后迭代。
foreach输出
foreach输出之前我们简单地讲过一遍他的使用方法。
例:利用foreach输出集合数据
package Project.Study.ListIteratorClass;
import java.util.ArrayList;
import java.util.List;
public class Test2 {
public static void main(String[]args){
List<String>all = new ArrayList<>(); //实例化List接口对象
all.add("Hello"); //向集合里面保存数据
all.add("World");
all.add("Hello");
all.add("!!!");
//集合中包含的数据都是String型,所以需要使用String接收集合中的每一个数据
for (String str:all
) {
System.out.println(str);
}
}
}
//结果:
//Hello
//World
//Hello
//!!!
Enumeration输出
Enumeration(枚举输出)的定义如下:
public interface Enumeration<E>{
public boolean hasMoreElements(); //判断是否有下一个元素,等同于hasNext()
public E nextElement(); //取出当前元素,等同于next()
}
例:利用Enumeration接口输出对象
package Project.Study.ListIteratorClass;
import java.util.Enumeration;
import java.util.Vector;
public class Test3 {
public static void main(String[]args){
Vector<String>all = new Vector<>(); //实例化Vector子类对象
all.add("Hello"); //向集合里面保存数据
all.add("World");
all.add("Hello");
all.add("!!!");
Enumeration<String> enu = all.elements(); //取得Enumeration接口对象
while(enu.hasMoreElements()){ //判断是否有数据
String str = enu.nextElement(); //取出当前数据
System.out.println(str); //输出数据
}
}
}
//结果:
//Hello
//World
//Hello
//!!!