Collection接口和迭代器

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】代码

package collection;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.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】代码

package collection;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值