对于集合的遍历操作,可以使用 itrator foreach for 循环,下面比较一下各自的优缺点

来源:互联网 发布:微博 知乎 编辑:程序博客网 时间:2024/06/06 00:17
List<String> list = new ArrayList<String>();        list.add("11");        list.add("11");        list.add("33");        list.add("44");        for (int i =0; i < list.size(); i++) {            if(list.get(i).equals("11")){                list.remove(i);            }        }输出:[11,33, 44] 

分析:list底层实现是一个数组,删除一个之后下标发生了左移,发生错误,无论是修改还是删除,不建议使用这种方式

Iterator<String> it = list.iterator();while(it.hasNext()){            String temp = (String)it.next();            if(temp.equals("11")){                it.remove();            }        }        System.out.println(list.toString());输出:[33, 44]

分析:为什么这个可以呢?因为itrator的remove()方法有一步:expectedModCount = modCount,删除很方便,但是不能做修改

for(String loop : list){            if(loop.equals("11")){                list.remove(loop);            }            if(loop.equals("22")){                list.remove(loop);            }        }        System.out.println(list.toString());输出: java.util.ConcurrentModificationException

分析:list底层有一个modcount标记,每次进行修改前会加1,再次删除是使用 if (modCount != expectedModCount) 进行判断是否相等,相等才可以操作。不能进行删除,但是可以修改

再补充一个问题:

String[] vendorIdArr = {"11","22","33"};        List<String> vendorIdResultList = Arrays.asList(vendorIdArr);        vendorIdResultList.remove(0);输出:java.lang.UnsupportedOperationException 

分析:java.util.Arrays$ArrayList 没有重写add(), removew()方法 ,使用 List vendorIdResultList = new ArrayList(Arrays.asList(vendorIdArr))代替List vendorIdResultList = Arrays.asList(vendorIdArr)即可

总结:修改使用foreach(),删除使用iterator(),既要删除又要修改只能采做标记的方式,遍历后再根据标记操作,如果非得使用一个方式进行,不是没有,那就是使用for循环,但是是从尾部向头部遍历,这样就可以避免元素删除后未遍历的元素下标发生偏移,但是不建议使用。
当工作逐渐占据了生活的全部,只能从代码中窃取快乐。

0 0
原创粉丝点击