之前的讲解里面,发现Collection,List,Set中只有List是最方便进行输出操作的,所以本次要讲解集合的四种输出操作形式。
集合在JDK1.8之前支持四种输出。
Iterator(95%),ListIterator(0.05%),Enummeration(4.9%) foreach(0.05%)
最常用的是Iterator,其次是Enummeration。这两个操作必须掌握。
迭代输出接口:Iterator(核心)
如果遇见了集合操作,那么一般而言都会使用Iterator接口进行集合的输出操作,首先看java.util.Iterator接口
public interface Iterator<E>{
public boolean hasNext();
public E next();
}
这两个方法在Scanner类中见过,结果发现Scanner是Iterator接口的实现类。
Iterator本身是一个接口,如果要想取得本接口实例化只能够依靠Collection接口,它有一个操作方法:public Iterator E iterator();
范例:使用Iterator输出集合
public static void main(String[] args) throws Exception {
Set<String> all = new HashSet<String>();
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
all.add("AA");
all.add("BB");// 全部信息重复
all.add("BB");
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
Iterator<String> iter=all.iterator();//这里使用了Collection接口的一个方法取得Iterator对象
while(iter.hasNext()){
String str=iter.next();//Iterator规定了泛型 所以不需要使用类型转换
System.out.println(str);
}
}
image.png
由于这里不是对象集合的比较,只是String,所以并没有HashSet的重复问题体现。
综上,以后遇到集合遍历的问题,不需要任何思考,直接使用Iterator就可以了。
双向迭代:ListIterator(了解)
Iterator最大的问题是只能由前向后输出(99%的情况下都是这么作的),但是有些人认为应该可以实现双向输出(即可以由前向后,也可以由后向前)那么就可以使用Iterator的子接口——ListIterator接口。在这个接口里面主要是两个方法:
判断是否有前一个元素:
public boolean hasPrevious()
取得前一个元素:
public E previous();
同样有hasnext,next。
ListIterator是专门为List子接口定义的输出接口,List中含有:public ListIterator<E> listIterator用来获取实例
范例:完成双向迭代
public static void main(String[] args) throws Exception {
List<String> all = new ArrayList<String>();
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
all.add("AA");
all.add("BB");// 全部信息重复
all.add("BB");
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
ListIterator<String> iter=all.listIterator();//这里使用了Collection接口的一个方法取得Iterator对象
while(iter.hasNext()){
String str=iter.next();//Iterator规定了泛型 所以不需要使用类型转换
System.out.println(str);
}
System.out.println("由后向前输出:");
while(iter.hasPrevious()){
String str=iter.previous();
System.out.println(str);
}
}
image.png
如果要想实现由后向前的输出操作之前,一定要首先发生由前向后输出。
foreach输出
理论上foreach输出还是挺方便使用的,但是如果你们现在过多的使用foreach不利于理解程序。foreach本身可以方便的输出数组,集合也可以。(foeeach输出集合不推荐 下面仅作展示)
public static void main(String[] args) throws Exception {
List<String> all = new ArrayList<String>();
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
all.add("A");
all.add("B");// 全部信息重复
all.add("C");
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
for(String str:all){
System.out.println(str);
}
}
image.png
在初学阶段还是强烈建议使用Iterator操作。
Enumeration输出
Enumeration是与Vector类一起在JDK1.0的时候推出的输出接口,即:最早的Vector如果要想输出,就要使用我们的Enumeration接口。
public interface Enumeretion<E>{
public boolean hasMoreElements();//判断是否有下一个元素,等同于hasNext()
public E nextElement();//取出元素,等同于next
}
但是如果想取得Enumeration接口的实例化对象只能够依靠Vector子类:
取得Enumeration接口对象:public Enumeration<E> elements()
public static void main(String[] args) throws Exception {
Vector<String> all = new Vector<String>();
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
all.add("A");
all.add("B");// 全部信息重复
all.add("C");
System.out.println("length:" + all.size() + " is empty:" + all.isEmpty());
Enumeration<String> enu=all.elements();
while(enu.hasMoreElements()){
String str=enu.nextElement();
System.out.println(str);
}
}
结果:
image.png
在一些古老的操作方法上,此接口依然会使用到,所以必须掌握
总结
虽然集合的输出提供有四种形式,但是一定要以Iterator以及Enumeration为主,并且一定要记清楚这两个接口的核心操作方法。(判断是否有下一个元素,如果有,就取出)
网友评论