本帖最后由 冥夜 于 2014-11-27 00:29 编辑  
 
在集合的视频中有讲到,在用一个迭代器来遍历一个集合时,只能使用这个迭代器来操作该集合内的元素,否则会出现异常。为什么呢?以下是楼主的个人理解:因为在使用其他类的方法来操作遍历中的元素时,若出现增加删除等操作,将会改变角标,而这时迭代器并不知道改变所以会出现安全隐患,所以直接就禁止使用非迭代器的方法在迭代器进行迭代时改变元素。 
 
以下是代码,假设需要移除保存了字符串的ArrayList集合al中所有值为str的字符串则定义了一个方法: 
private static void myremove(ArrayList<String> al,String str) 
        { 
                /*错误方法:使用集合的删除方法来删除 
               for(Iterator<String> it=al.iterator();it.hasNext();) 
                { 
                        String s=it.next(); 
                        if(str.equals(s)) 
                        { 
                                al.remove();/将会报异常。 
                        } 
 
                 */ 
                /*方法一:不遍历,使用集合本身的方法来删除 
                        if(al.contains(str)) 
                                al.remove(str); 
                */ 
                 
                /* 
                 * 方法2:创建一个新集合,存入不想删除的元素,最后返回该集合。PS:应把前面void改为ArrayList<String> 
                ArrayList<String> a=new ArrayList<String>(); 
                for(ListIterator<String> it=al.listIterator();it.hasNext();) 
                { 
                        String s=it.next(); 
                        if(!str.equals(s)) 
                        { 
                                a.add(s); 
                        } 
                } 
                return a; 
                */ 
                 
                //方法三:使用迭代器的删除方法来删除 
                for(Iterator<String> it=al.iterator();it.hasNext();) 
                { 
                        String s=it.next(); 
                        if(str.equals(s)) 
                        { 
                                it.remove();//用迭代器遍历时只能使用迭代器的方法操作元素,否则会出现异常。 
                        } 
                } 
 
 
 |