posts - 110, comments - 101, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
/**
 * 
 
*/

package com.test;

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不会抛异常




评论

# re: list 循环时 remove方法 异常 与 处理 方式 [未登录]  回复  更多评论   

2015-12-09 11:05 by Young
使用for(int i=0;i<list1.size();i++)这种形式去remove元素,虽然不会抛异常,但是未能正确的remove元素,最后的list1的size不等于0

只有注册用户登录后才能发表评论。


网站导航: