如何对ArrayList进行删除操作:
remove(int index);
remove(Object o);
removeAll(Collection<?> c);
用以上三个方法是可以正常使用的,但对ArrayList进行遍历删除元素时候需要格外注意:
List<String> testList = new ArrayList<String>();
testList.add("1");
testList.add("2");
testList.add("3");
testList.add("4");
testList.add("5");
testList.add("6");
分别采用三种方式遍历删除:
①for循环
for(int i = 0 ; i < testList.size() ; i++){
testList.remove(i);
}
for(String elem : testList){
System.out.println(elem);
}
结果:
②foreach循环
for(String elem : testList){
testList.remove(elem);
}
for(String elem : testList){
System.out.println(elem);
}
结果:
③iterator循环
Iterator<String> it = testList.iterator();
while(it.hasNext()){
it.next();
it.remove();
}
for(String elem : testList){
System.out.println(elem);
}
结果:空白(说明正常删除了全部元素)
下面对上面三种方式进行解析:
①for循环
因为for循环每次删除的是testList.remove(i);
当i=0;时testList.remove(0);删除掉了第一个元素,此时testList.size()大小为5。
当i=1;时testList.remove(1);删除掉此时testList中的第二个元素,略过了第一个元素。之后testList.size()大小为4。
当i=2;时testList.remove(2);删除掉此时testList中的第三个元素,略过了第1,2个元素。之后testList.size()大小为3。
当i=3;时i=testList.size(); for循环结束。所以并不能够完全删除掉整改ArrayList。
需要改写一下这个方法:
int length = testList.size();
for(int i = 0; i< length; i++){
String t = testList.get(0);
testList.remove(0);
}
此时就能够删除掉list的全部元素。
②foreach循环
java中的foreach循环其实就是根据list对象创建一个Iterator对象,用这个迭代对象来遍历testList,相当于list对象将元素的遍历托付给Iterator,如果要进行删除或者增加需要通过Iterator,直接对list进行删除时,Iterator会抛出ConcurrentModificationException异常
抛出异常的源码是:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
modCount是指这个list对象从new出来到现在被修改次数,当调用List的add或者remove方法的时候,这个modCount都会自动增减;
expectedModCount是指Iterator现在期望这个list被修改的次数是多少次。
iterator创建的时候modCount被赋值给了expectedModCount,但是调用list的add和remove方法的时候不会同时自动增减expectedModCount,这样就导致两个count不相等,从而抛出异常。
在ArrayList的所有涉及结构变化的方法中都增加modCount的值,包括:add()、remove()、addAll()、clear()等,这些方法每调用一次,modCount的值就加1。
③Iterator循环
因为是借助Iterator来删除list的元素,所以不会有问题,如果循环中使用list本身来删除同意会抛异常。
综上,推荐使用改进的第一种和第三种方式来迭代循环删除ArrayList
- 大小: 8.5 KB
- 大小: 23.3 KB
分享到:
相关推荐
主要介绍了java使用ArrayList遍历及效率比较,实例分析了ArrayList遍历的方法与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
主要介绍了Java ArrayList遍历修改代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
arraylist是动态数组,它具有三个好处分别是:动态的增加和减少元素 、实现了ICollection和IList接口、灵活的设置数组的大小,本文给大家介绍java arraylist遍历及Java arraylist 用法,感兴趣的朋友一起学习吧
如何遍历ArrayList的入门实例,可作为入门参考
ArrayList排序和遍历补充案例.java
在jni中操作arraylist对象,然后添加一个int型数据进去
Java是一种编程语言,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的“形式和感觉”,但它要比C++语言更易于使用,而且在编程时彻底采用了一种“以对象为导向”的方式。 使用Java编写的应用程序,既...
用java编写的迭代器,实现10数字正反向遍历。
day07_18_ArrayList练习三_按指定格式遍历集合字符串
遍历ArrayList存入HashMap中
主要给大家介绍了ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论。相信对大家的理解和学习具有一定的参考价值,有需要的...
集合ArrayList测试集合ArrayList测试集合ArrayList测试集合ArrayList测试集合ArrayList测试集合ArrayList测试
本文对JAVA ArrayList做了详细介绍,文中学到了ArrayList源码解析、ArrayList遍历方式、toArray()异常,最后给出了ArrayList示例。
NULL 博文链接:https://liucanwen.iteye.com/blog/1628119
测试ArrayList,Dictionary,List,DataSet等对象的遍历性能
tree,ArrayList的创建与遍历插入 面试时可能会用到哦 1、根据 根节点rootId创建treeSize个子节点的tree树 2、根据list及父节点 列出父节点下的所有子节点 3、查找根节点 根据父节点找到对应的树 不足之处望大家...
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
ArrayList HashSet HashMap LinkedList 遍历方法 传统遍历方法 for(int i=0;i<list.size();i++) { String str = list.get(i); ... } 内置迭代器 for (String str : list) { ... } 显式迭代器 Iterator it = ...
arrayList排序arrayList排序arrayList排序
使用对象ArrayList填充DataGrid,C#源代码ArrayList MyList = new ArrayList();