详解 Java 中的 Iterable、Itetator、Enumeration

/ Java / 没有评论 / 1367浏览

详解 Java 中的 Iterable、Itetator、Enumeration

Java 中对一些集合循环遍历做了一些特殊的封装。一些是方便我们的操作,一些是存在存储性能等方面设计的。关于 Iterable、Itetator、Enumeration,我们一起来学习它们。

Iterable

Iterable接口实现后的功能是“返回”一个迭代器,我们常用的实现了该接口的子接口有: Collection, Deque, List, Queue, Set 等.该接口的iterator()方法返回一个标准的Iterator实现。实现这个接口允许对象成为 For each 语句的目标。就可以通过For each语法遍历底层序列。

采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快。

采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。

Iterator

在Java集合框架中Iterator用来替代Enumeration,Iterator允许调用者在迭代中从底层集合中删除元素。

接口方法如下:

boolean hasNext();//如果迭代中还有元素返回true。
Object	 next();//返回迭代中的下一个元素。
void	 remove();//迭代器从底层集合中删除刚返回的元素。该方法只能在每次调用next后调用一次。

具体用法如下:

public class TestIterator { 
    public  static void main(String[] args) {
        List list=new ArrayList();
        Map map=new HashMap();
        //初始化list和map的数据
        for(int i=0;i<10;i++){
            list.add(new String("list"+i) );
            map.put(i, new String("map"+i));
        } 
        Iterator iterList= list.iterator();//List接口实现了Iterable接口
        //循环list 
        while(iterList.hasNext()){
             System.out.println((String)iterList.next());  
        } 
        //for each是jdk5.0新增加的一个循环结构,可以用来处理集合中的每个元素而不用考虑集合定下标。
        //如需删除集合元素,慎用!!!
        for(String str : list){
            System.out.println(str);
        }
        Iterator iterMap=map.entrySet().iterator();
        //循环map
        while(iterMap.hasNext()){
            System.out.println((Map.Entry)iterMap.next().getValue());  
        } 
    } 
}

Enumeration

枚举接口,其作用和Iterator类似。只提供了遍历Vector和HashTable类型集合元素的功能,不支持元素的移除操作。

//是否还有元素,如果有返回true,否则表示至少含有一个元素
boolean hasMoreElements();
//如果Enumeration枚举对象还有元素,返回对象只能的下一个元素,否则抛出NoSuchElementException异常。
E nextElement();

使用教程如下:

public class TestEnumeration{
	public static void main(String[] args){
        //初始化创建Vector
        Vector v = new Vector();
        v.addElement("Lisa");
        v.addElement("Billy");
        v.addElement("Mr Brown");
        Enumeration e = v.elements();//返回Enumeration对象
        while(e.hasMoreElements()){
            String value = (String)e.nextElement();//调用nextElement方法获得元素
            System.out.print(value);
        }
        //初始化创建hashtable
        Hashtable<String, String> ht = new Hashtable<String, String>();
        for (int i = 0; i < 10000; i++) {
            ht.put("Key=" + i, "Val=" + i);
        }
        //1.Enumeration
        Enumeration<String> en = ht.keys();//使用枚举获取key
        //下面的也可以哦
        //Enumeration<String> en = ht.elements();//使用枚举获取这个key-value对
        while (en.hasMoreElements()) {
            System.out.print((String) en.nextElement());
        }
        //2.Iterator 迭代器
        //使用迭代器获取这个key-value对
        Iterator<Entry<String, String>> it1 = ht.entrySet().iterator();
        //使用迭代器获取这个key
        //Iterator<String> it2 = ht.keySet().iterator();
        while (it.hasNext()) {
            //System.out.print((Entry<String, String>) it1.next().getKey());
            //System.out.print((String) it2.next());
        }
    }
}