输出集合中的元素,我们可以通过覆写toString()方法,或者利用List接口的get()方法,但这些都不是集合的标准输出。
那么,集合标准输出一共有以下四种方式:
- Iterator
- ListIterator
- Enumeration
- foreach
迭代输出——Iterator
集合输出的时候要形成以下的思路:只要碰到了集合输出的操作,就一定使用Iterator接口,这是最重要的标准。
1. Iterator接口的操作原理:
Iterator是专门的迭代输出接口,所谓的迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容,则把内容输出。
2. Iterator接口实例化方式:
Iterator本身是一个接口,要想实例化,必须利用其子类—Collection接口来完成,在Collection接口中一个iterator()方法,该方法用于取得Iterator对象,因此我们可以利用这个方法来获取Iterator对象,然后调用Iterator相关方法完成输出操作。
即实例化Iterator接口的方法如下:
List<E> list= new List子类<E>() ;
Iterator<E> iter = list.iterator() ; // 为Iterator接口实例化
3. Iterator接口的方法:
方法 | 描述 |
public boolean hasNext(); | 判断是否有下一个元素 |
public E next(); | 取得当前元素 |
public default void remove(); | 删除元素 |
范例1:使用Iterator接口标准输出
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("hello");
list.add("word");
Iterator<String> iterator=list.iterator();//实例化Iterator对象
while(iterator.hasNext()){
String str=iterator.next();//取得当前元素
System.out.println(str);
}
}
}
范例2:使用Iterator接口删除集合元素
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("hello");
list.add("word");
Iterator<String> iterator=list.iterator();//实例化Iterator对象
while(iterator.hasNext()){
String str=iterator.next();
if(str.equals("hello")){
iterator.remove();
// 使用集合提供的remove()方法,则会产生ConcurrentModificationException
// list.remove("B") ;
// 使用Iterator的remove方法则不会产生异常
continue;
}
System.out.println(str);
}
}
}
注:在集合输出的时候,一般不修改集合中的元素,此处涉及同步问题。
双向迭代接口——ListIterator
Iterator输出有一个特点:只能由前向后进行内容的迭代处理
如果要想进行双向迭代,那么就必须依靠Iterator的子接口——ListIterator来实现
1. ListIterator接口实例化方式
Iterator接口实例化需要依靠它的子类Collection子类,而ListIterator接口的实例化则依靠List接口(不能使用Set接口)
List接口提供了 listIterator()方法,该方法可以取得ListIterator的对象
public ListIterator listIterator();
即实例化 ListIterator接口的方法如下:
List<String> list=new ArrayList<>();
ListIterator<String> listIterator=list.listIterator();//实例化ListIterator对象
2. ListIterator接口的方法
方法 | 描述 |
public boolean hasPrevious(); | 判断是否有上一个元素 |
public E previous(); | 取得上一个元素 |
3. ListIterator接口实现标准输出
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("hello");
list.add("word");
ListIterator<String> listIterator=list.listIterator();//实例化ListIterator对象
System.out.println("由前向后输出");
while(listIterator.hasNext()){
System.out.print(listIterator.next()+" ");
}
System.out.println("\n由后向前输出");
while(listIterator.hasPrevious()){
System.out.print(listIterator.previous()+" ");
}
}
}
输出结果:
在这里需要注意:如果想实现由后向前的输出,那么应该首先进行从前向后的输出,否则无法实现双向
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("hello");
list.add("word");
ListIterator<String> listIterator=list.listIterator();//实例化ListIterator对象
System.out.println("\n由后向前输出");
while(listIterator.hasPrevious()){
System.out.print(listIterator.previous()+" ");
}
}
}
输出结果:
Enumeration枚举输出
1.Enumeration实例化方式
前两种标准输出接口可以依靠Collection、List、Set等接口完成实例化,但是Enumeration想要实例化只能够依靠Vector子类,因为Enumeration最早的设计就是为Vector服务的,在Vector类中提供有一个取得Enumeration接口对象的方法:
public Enumeration elements()
2.Enumeration的方法
方法 | 描述 |
public boolean hasMoreElements(); | 判断是否有下一个元素 |
public E nextElement(); | 取得元素 |
3.使用Enumeration输出
public class Test{
public static void main(String[] args) {
Vector<String> vector=new Vector<>();
vector.add("hello");
vector.add("word");
Enumeration<String> enumeration=vector.elements();//实例化Enumeration对象
while(enumeration.hasMoreElements()){
System.out.print(enumeration.nextElement());
}
}
}
foreach输出
从JDK1.5开始foreach可以输出数组,实际上除了数组之外也可以输出集合。
范例:使用foreach输出
public class Test {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("hello");
list.add("word");
for(String str:list){
System.out.println(str);
}
}
}