Collection接口和迭代器

来源:互联网 发布:js 图片跟随鼠标移动 编辑:程序博客网 时间:2024/06/08 14:26

Collection接口和迭代器

1、Collection的常见方法:

1,添加。

       boolean add(Object obj):

       boolean addAll(Collection coll):

2,删除。

       boolean remove(object obj):

       boolean removeAll(Collection coll); //将两个集合中的相同元素从调用removeAll的集合中删除。(删除相同,保留不同)

       void clear();

3,判断:

       boolean contains(object obj):

       boolean containsAll(Colllection coll);

       boolean isEmpty():判断集合中是否有元素。

4,获取:

       int size():

       Iterator iterator():取出元素的方式:迭代器。

5,其他:

       boolean retainAll(Collection coll);取交集。//取交集,保留和指定的集合相同的元素,而删除不同的元素。(删除不同,保留相同)和removeAll功能相反

 

       Object[] toArray():将集合转成数组。

2、Collection接口的继承接口(两大体系)

       |--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。

       |--Set:元素不能重复,无序。

3、迭代器Iterator(collection集合共有)


迭代器:就是实现了一个Iterator接口的每一个容器内部的内部对象

       该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。所以该迭代器对象是在容器中进行内部实现的。(依赖于容器的内部类)

       对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator方法。

       Iterator接口就是对所有的Collection容器进行元素取出的公共接口。

       其实就是抓娃娃游戏机中的夹子!

4、ListIterator接口(List集合特有)

5、迭代器演示:

5.1实例代码

    public static void main(String[] args) {        List list = new ArrayList();                    list.add("abc1");       list.add("abc2");       list.add("abc3");       System.out.println("list:" + list);        /*        *//Iterator 迭代器遍历 Iterator it=list.iterator(); while(it.hasNext()){        *Object obj=it.next(); if(obj.equals("abc2")){        *list.add("abc9");//java.util.ConcurrentModificationException //某个线程在        *Collection 上进行迭代时,通常不允许另一个线性修改该 Collection        *        *//在迭代器过程中,不要使用集合操作元素,容易出现异常。        *//可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。 } else        *System.out.println("next:"+obj); }System.out.println("list:"+list);        */        // ListIterator迭代器遍历       ListIterator lit = list.listIterator();// 它可以实现在迭代过程中完成对元素的增删改查。                                          // 注意:只有list集合具备该迭代功能.       while (lit.hasNext()) {           Object obj = lit.next();           if ("abc2".equals(obj)) {              lit.set("abc99");           } else {              System.out.println("next:" + obj);           }       }       System.out.println("修改后list:" + list);    }}


5.2迭代器Iterator和ListIterator比较

Iterator:

(1)Collection集合共有

(2)可以遍历集合中的元素,但是只能单向遍历

(3)可以删除元素

(4)不可以修改元素

(5)不能定位当前索引的位置

ListIterator:

(1)List集合特有

(2)可以遍历集合中的元素,可以双向遍历

(3)可以删除元素

(4)可以修改元素,在遍历的同时实现对象的添加(add方法)或者对象的修改(set方法)

(5)可以定位当前索引的位置(nextIndex方法和previousIndex方法)

5.3迭代器错误使用案例与解析

5.3.1错误使用案例

(1)Iterator使用
【1】代码

packagecollection; importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;import java.util.ListIterator; public class IteratorFirst {     public static void main(String[] args) {        List list = new ArrayList();       list.add("abc1");       list.add("abc2");       list.add("abc3");       System.out.println("list:" + list);        // Iterator 迭代器遍历       Iterator it = list.iterator();       while (it.hasNext()) {           Object obj = it.next();           if (obj.equals("abc2")) {              list.add("abc9");// java.util.ConcurrentModificationException              //某个线程在Collection 上进行迭代时,通常不允许另一个线性修改该 Collection               // 在迭代器过程中,不要使用集合操作元素,容易出现异常。              // 可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。 } else              System.out.println("next:" + obj);           }        }       System.out.println("list:" + list);    } }

【2】结果

list:[abc1,abc2, abc3]

next:abc2

Exceptionin thread "main" java.util.ConcurrentModificationException

    atjava.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)

    at java.util.ArrayList$Itr.next(ArrayList.java:851)

    at collection.IteratorFirst.main(IteratorFirst.java:21)

(2)ListIterator使用
【1】代码

packagecollection; importjava.util.ArrayList;import java.util.Iterator;importjava.util.List;importjava.util.ListIterator; public class IteratorTest {     public static void main(String[] args) {        List list = new ArrayList();        list.add("abc1");       list.add("abc2");       list.add("abc3");       System.out.println("list:" + list);        // ListIterator迭代器遍历       ListIterator lit = list.listIterator();// 它可以实现在迭代过程中完成对元素的增删改查。                                          // 注意:只有list集合具备该迭代功能.       while (lit.hasNext()) {           Object obj = lit.next();           if ("abc2".equals(obj)) {//            lit.set("abc99");//ListIterator方法修改元素,没有问题              list.add("abc88");//在迭代器便利时,利用list集合的方法添加或修改元素,会抛出异常                                //java.util.ConcurrentModificationException           } else {              System.out.println("next:" + obj);           }       }    }    }

【2】结果

list:[abc1,abc2, abc3]

next:abc1

Exceptionin thread "main" java.util.ConcurrentModificationException

    atjava.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)

    at java.util.ArrayList$Itr.next(ArrayList.java:851)

    at collection.IteratorTest.main(IteratorTest.java:22)

 

5.3.2解析

(1)在利用迭代器进行遍历集合a时,不能利用集合a的方法,去修改或者添加元素。否则会抛出异常:ConcurrentModificationException

备注:ConcurrentModificationException---------某个线程在Collection上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE提供的所有通用collection 实现)可能选择抛出此异常

(2)只能利用迭代器自身的方法去修改,当前正在遍历的集合a其中Iterator只能删除元素,不能修改集合元素;

而ListIterator不但可以删除元素,而且可以在遍历的同时,给集合添加元素或者修改集合中的元素内容

5.4  Iterator和ListIterator比较参考文章

CSDN博文:JAVA中ListIterator和Iterator详解与辨析

地址:http://blog.csdn.net/longshengguoji/article/details/41551491