List remove

来源:互联网 发布:西部数码域名实名认证 编辑:程序博客网 时间:2024/06/05 04:18
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 
@author hello_yun
 *
 
*/

public class ListOperation
{

    /**
     * 
@param args
     
*/

    public static void main(String[] args)
    {
        List<Integer> list1 = new ArrayList<Integer>();
        List<Integer> list2 = new CopyOnWriteArrayList<Integer>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        
        list2.add(3);
        list2.add(4);
        
//        try
//        {
//            for(Integer in : list1){
//                list1.remove(in);//直接循环 删除对象会抛异常
//            }
//        } catch (Exception e)
//        {
//            System.out.println("list1 size : "+list1.size());
//            System.out.println("循环list1 异常 : "+e);
//        }
        
        
        for(Integer in : list2){
            list2.remove(in);
            System.out.println("list2 : "+list2.size());
        }

        
         
        
        list1.add(1);
        list1.add(2);
        
        list2.add(3);
        list2.add(4);
        
        for (Iterator iterator = list1.iterator(); iterator.hasNext();)
        {
            iterator.next();
            iterator.remove();
        }

        
        
        try
        {
            for (Iterator iterator = list2.iterator(); iterator.hasNext();)
            {
                iterator.next();
                iterator.remove();
            }


        }
 catch (Exception e)
        {
            System.out.println("copyOnWriteArrayList remove : "+ e);
        }

        
        
//-------------这种方式 不会抛异常 -------------------------
        try
        {
            for(int i=0;i<list1.size();i++){
                list1.remove(i);
            }


        }
 catch (Exception e)
        {
            System.out.println("list1 size : "+list1.size());
            System.out.println("循环list1 异常 : "+e);
        }


    }


}


使用 copyOnWriteArrayList时 ,通过 list.remove()方法是安全的 但是使用iterator.remove是会抛异常的
查看copyOnWriteArrayList源码 会发现 iterator.remove方法的实现是直接抛异常的
        /**
         * Not supported. Always throws UnsupportedOperationException.
         * @throws UnsupportedOperationException always; <tt>remove</tt>
         *         is not supported by this iterator.
         */
        public void remove() {
            throw new UnsupportedOperationException();
        }

但是通过ArrayList实现时, list.remove会抛异常 java.util.ConcurrentModificationException,
但是 ArrayList的 iterator.remove不会抛异常
0 0