Java集合类之集合输出

在之前进行集合输出的时候都利用了toString(),或者利用了List接口中的get()方法。这些都不是集合的标准输出。如果从标准上来讲,集合输出一共有四种手段:Iterator、ListIterator、Enumeration、foreach。

1. 迭代输出:Iterator
在JDK1.5之前,在Collection接口中就定义有iterator()方法,通过此方法可以取得Iterator接口的实例化对象;而在JDK1.5之后,将此方法提升为Iterable接口中的方法。无论你如何提升,只要Collection有这个方法,那么List、Set也一定有此方法。

对于Iterator接口最初的设计里面实际有三个抽象方法:

  1. 判断是否有下一个元素: public boolean hasNext();
  2. 取得当前元素: public E next();
  3. 删除元素: public default void remove(); 此方法从JDK1.8开始变为default完整方法。

范例:标准的 Iterator 使用

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        list.add("hello");
        list.add("Java");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String str = iterator.next();
            System.out.println(str);
        }
    }

对于Iterator接口中提供的remove()方法主要解决的就是集合内容的删除操作。
范例:删除元素

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        list.add("hello");
        list.add("Java");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String str = iterator.next();
            if(str.equals("Hello")) {
                // 使用集合提供的remove()方法,则会产生ConcurrentModificationException
                // list.remove("Hello");
                // 使用Iterator的remove()方法则不会产生异常
                iterator.remove();
                continue;
            }
            System.out.println(str);
        }
    }
}

报错原因:在ArrayList的源码中有一个参数modCount表示集合的修改次数,每一次修改集合modCount的值就会+1;遍历集合时会将modCount的值传给Iterator,在遍历时修改元素,则modCount的值就会发生变化,modCount的值就会与原本在Iterator中的值不一致,就会出现异常。其存在的目的是:多线程下保证数据的安全性。
因此,在今后的使用中无论如何也不要在集合输出时修改集合元素。

2. 双向迭代接口:ListIterator
Iterator输出有一个特点:只能够由前向后进行内容的迭代处理,而如果要想进行双向迭代,那么就必须依靠Iterator的子接口:ListIterator来实现。首先来观察一下此接口定义的方法:

  1. 判断是否有上一个元素:public boolean hasPrevious();
  2. 取得上一个元素:public E previous();

Iterator接口对象是由Collection接口支持的,但是ListIterator是由List接口支持的,List接口提供有如下方法:

取得ListIterator接口对象:public ListIterator listIterator();

范例:观察ListIterator接口的使用

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        list.add("hello");
        list.add("Java");
        ListIterator<String> listIterator = list.listIterator();
        System.out.print("从前往后输出: ");
        while (listIterator.hasNext()) {
            System.out.print(listIterator.next()+"、 ");
        }
        System.out.print("\n从后往前输出: ");
        while (listIterator.hasPrevious()) {
            System.out.print(listIterator.previous()+"、 ");
        }
    }
}

如果要想实现由后向前的输出,那么应该首先进行从前向后的输出,否则无法实现双向。

3. 枚举输出:Enumeration
在JDK1.0的时候就引入了Enumeration输出接口,而在JDK1.5的时候对其也做了更正,主要是追加了泛型的应用。首先来观察Enumeration的接口定义:

  1. 判断是否有下一个元素:public boolean hasMoreElements();
  2. 取得元素:public E nextElement();

但是要想取得这个接口的实例化对象,是不能依靠Collection、List、Set等接口的。只能够依靠Vector子类,因为Enumeration最早的设计就是为Vector服务的,在Vector类中提供有一个取得Enumeration接口对象的方法:

取得Enumeration接口对象:public Enumeration elements()

范例:使用 Enumeration 输出

import java.util.Enumeration;
import java.util.Vector;

public class Test {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("Hello");
        vector.add("World");
        vector.add("hello");
        vector.add("Java");
        Enumeration<String> enumeration = vector.elements();
        while (enumeration.hasMoreElements()) {
            System.out.println(enumeration.nextElement());
        }
    }
}

目前仍有一些操作类库上只支持Enumeration,而不支持Iterator。

foreach输出
从JDK1.5开始foreach可以输出数组,实际上除了数组之外也可以输出集合。
范例:使用 foreach 输出

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        list.add("hello");
        list.add("Java");
        for (String string : list) {
            System.out.println(string);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yubujian_l/article/details/80535373