Collection集合的概述及程序出现的异常

1.Java提供集合类用于保存盛装引用类型变量,因此集合类也被成为容器类. 所有的集合类都位于java.util包下. 集合只能用来存放

引用数据类型(即对象,实际上是保存对象的引用变量).

2.Java的集合类主要由两个接口派生而出: Collection和Map, Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类.

3.Collection集合的两个子接口:Set和List , 分别代表了无序集合和有序集合. Queue是Java提供的队列实现.

4.Collection集合的高级功能:

5.Collection集合和Iterator接口.

        Iterator接口也是java集合框架, Collection集合用来盛装对象, 而Iterator接口用来遍历集合. Iterator对象也被称为迭代器.

        Iterator接口中的三个方法:

                                        boolean hasNext():如果被迭代的集合元素还没有被遍历,则返回true

                                        Object next():返回集合里下一个元素.

                                        void remove():删除集合里上一次next()方法返回的元素.

6.并发修改异常

    (1)
            Collection<String> c=new ArrayList<String>();
        
            c.add("hello");
            c.add("world");
            c.add("java");
            c.add("javase");
        
            System.out.println("c:"+c);
        
            Iterator<String> it=c.iterator();
        
            while(it.hasNext()) {
            
                String s=it.next();
            
                if(s.equals("javase")) {
                
                    c.remove(s);//错误,将会引发异常

                    c.add("hhh");//同上

                    //修改方法: it.remove();

                }

                 s="emmm";  //对s变量进行赋值,不会影响集合元素

            }
        

            System.out.println(c);

        当用迭代器遍历集合时,不能通过Collection集合修改(增加或删除)集合元素, 只有通过Iterator里的remove()方法来移除       上一次next()方法返回的元素,否则将会引发ConcurrentModificationException异常.

         Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中其他线程修改),程序立即引发并发修改异常,而不是显示显示修改之后的结果,这样可以避免共享资源而引发的潜在问题.

        另外一种解决并发修改异常的方法:使用集合遍历,使用集合删除

        Collection<String> c=new ArrayList<String>();
        
        c.add("hello");
        c.add("world");
        c.add("java");
        c.add("javase");
        
        
        Object[] arrstr=c.toArray();
        
        
        for(int x=0;x<arrstr.length;x++) {
            String s=(String)arrstr[x];
            if(s.equals("javase")) {
                
                c.remove(s);        //正确
            }
        }
        
        System.out.println(c);
        
        for(String s:c) {
            System.out.println(s);

        }

 

结论: 当使用迭代器遍历集合时,只能通过迭代器来删除集合中的元素;  也可以通过将集合转换数组,然后遍历过程中对集合元素进行增删. 不能使用迭代器遍历集合而通过集合来增删元素,这样会引起并发修改异常.

7.可以使用增强for循环来遍历集合, 当使用增强for来遍历集合时, 集合也不能增删元素,否则会引发ConcurrentModificationException异常.

例:                Collection   c=new  ArrayList();

                    for(Object obj: c){

                        String s=(String)obj;

                        if(s.equals("...")){

                                c.add("....");  //错误,会引发异常

                        }


                    }

解决方法:将集合转换成数组,然后遍历的时候可以修改集合.


8.Collection集合的高级功能

boolean  addAll(Collection c):添加一个集合中所有元素

boolean removeAll(Collection c):删除的高级功能,( 删除所有还是删除一个算是删除?)

结论:删除一个算是删除;

例:Collection<String> c=new ArrayList<String>();
        
        c.add("abc1");
        c.add("abc2");
        c.add("abc3");
        
        Collection<String> c2=new ArrayList<String>();
        c2.add("abc1");
      
        
        System.out.println(c.removeAll(c2));  //true
        System.out.println(c);     //[abc2,abc3]

        System.out.println(c2);   //[abc1]

boolean containsAll(Collection c):结论:包含所有算是包含;

例:Collection<String> c=new ArrayList<String>();
       
        c.add("abc1");
        c.add("abc2");
        c.add("abc3");
        
        Collection<String> c2=new ArrayList<String>();
        c2.add("abc1");
        c2.add("abc2");
        c2.add("abc5");

        
        System.out.println(c.containsAll(c2));       //false
        System.out.println(c);        //[abc1,abc2,abc3]

        System.out.println(c2);            //[abc1,abc2,abc5]

boolean  retainAll(Collection c):A集合对B集合取交集, 交集元素全部到A集合中去,  如果A集合中元素发生变化, 则返回true,否则返回false.

例:Collection<String> c=new ArrayList<String>();
        
        c.add("abc1");
        c.add("abc2");
        c.add("abc3");
        
        Collection<String> c2=new ArrayList<String>();
        c2.add("abc1");
        c2.add("abc2");      
        
        System.out.println(c.retainAll(c2));        //true
        System.out.println(c);        //[abc1,abc2]

        System.out.println(c2);            //[abc1,abc2]





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值