Java的Collection接口

Colleciton概述

Collection 接口是 List、Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。

JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)实现。

在 Java5 之前,Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理;从 Java5 增加了泛型以后,Java 集合可以记住容器中对象的数据类型

 

注:    [1]Collection是保存单值集合的最大父接口。

 

使用Iterator接口遍历集合元素

Iterator接口:

Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。

所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象

Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建 Iterator 对象,则必须有一个被迭代的集合。

 

操作原理:Iterator是专门的迭代输出接口,所谓的迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容则把内容取出。

Iterator<Account> iterator = list.iterator();

while(iterator.hasNext()){

         System.out.println(iterator.next().show());

}

在调用iterator.next()方法之前必须要调用iterator.hasNext()进行检测。若不调用,且下一条记录无效,直接调用iterator.next()会抛出NoSuchElementException异常。

 

正常情况下,一个集合要把内容交给Iterator 输出,但是集合操作中也存在一个remove()方法,如果在使用Iterator输出时,集合自己调用了删除方法,则会出现运行时的错误。

Iterator<String> it = list.iterator();

while(it.hasNext()){

    String str = it.next();

    if("_".equals(str)){

           list.remove(str); //应该使用 it.remove();

    }else{

           System.out.println(str+"、");

    }

}

System.out.println("删除之后的集合:" + list);

 

ListIterator接口:

Iterator 接口的主要功能是由前向后单向输出,而此时如果想实现由后向前或是由前向后的双向输出,则就必须使用Iterator的子接口ListIterator。

与Iterator接口不同的是,ListIterator接口只能通过List接口实例化,即只能输出List接口中的内容。

ListIterator<String> lit = list.listIterator();

while(lit.hasNext()){

        System.out.println(lit.next()); //由前向后输出

}

while(lit.hasPrevious()){

        System.out.println(lit.previous()); //由后向前输出

}

 

Iterator 和 ListIterator 的区别是什么?

1)Iterator 可用来遍历 Set 和 List 集合,但是 ListIterator 只能用来遍历 List。

2)Iterator 对集合只能是前向遍历, ListIterator 既可以前向也可以后向。

3)ListIterator 实现了 Iterator 接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

 

快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

1)Iterator 的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。

2)java.util包下面的所有的集合类都是快速失败的,而 java.util.concurrent 包下面的所有的类都是安全失败的。

3)快速失败的迭代器会抛出 ConcurrentModificationException 异常,而安全失败的迭代器永远不会抛出这样的异常。

 

Enumeration 接口和 Iterator 接口的区别有哪些?

1)Enumeration 速度是 Iterator 的 2 倍,同时占用更少的内存。

2)但是,Iterator 远远比 Enumeration安全,因为其他线程不能够修改正在被 iterator 遍历的集合里面的对象。

3)同时,Iterator 允许调用者删除底层集合里面的元素,这对 Enumeration 来说是不可能的。

 

使用foreach循环遍历集合元素

Java 5 提供了 foreach 循环迭代访问 Collection

for(Account acc : list){

        System.out.println(acc.show());

}

 

使用Enumeration接口遍历集合元素

Enumeration 接口是 Iterator 迭代器的 “古老版本”,是JDK1.0时推出的。

Enumeration stringEnum = new StringTokenizer("a-b*c-d-e-g", "-");

while(stringEnum.hasMoreElements()){

        Object obj = stringEnum.nextElement();

        System.out.println(obj);

}

Enumeration<String> enu = vector.elements();

while(enu.hasMoreElements()){

        System.out.println(enu.nextElement());

}

 

 

猜你喜欢

转载自blog.csdn.net/lxxiang1/article/details/81277175
今日推荐