如何从List集合中删除对象

这个问题看似好像挺简单挺幼稚的,然而就这个幼稚的问题还曾经困扰过我一阵呢,其实犯这个错误的根本原因是我们对于基础知识的理解和掌握上还有不足的表现,基本功有些人总是觉得不重要,认为更多的扩大学习的广度才是最重要的,我认为这是很容易犯的,同时也是很致命的错误观点!

对基础知识掌握不牢靠,或理解不深刻,写出的代码必然会有40%的概率是错误的、低效的,一段代码不是说没有编译错误就一定是对的,不是说简单的运行下就一定是对的,优秀的代码,是经得起“刀山火海”般的考验的(“多线程、效率、安全”这三坐大山)。

所以重要性,我就不再强调了,相信说完后,地球人都能懂我的意思,那么下面就来看看这个有趣的现象吧。

先看看如下代码

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestList {

	void init(List<Integer> list) {
		list.clear();
		for (int i = 0; i < 10; i++) {
			list.add(i + 1);
		}
	}

	void remove(List<Integer> list) {
		for (int i = 0; i < 5; i++) {
			list.remove(i);
		}
	}

	void removeTwo(List<Integer> list) {
		for (int i : list) {
			if (i < 6) {
				list.remove(i);
			}
		}
	}

	void removeThree(List<Integer> list) {
		for (Iterator<Integer> iter = list.iterator(); iter.hasNext();) {
			int i = iter.next();
			if (i < 6) {
				iter.remove();
			}
		}
	}

	public static void main(String[] args) {
		TestList testList = new TestList();
		List<Integer> list = new ArrayList<Integer>();

		// 第一种方法
		testList.init(list);
		testList.remove(list);
		System.out.println(list);

		// 第二种方法
		try {
			testList.init(list);
			testList.removeTwo(list);
			System.out.println(list);
		} catch (Exception e) {
			e.printStackTrace();
		}

		// 第三种方法
		testList.init(list);
		testList.removeThree(list);
		System.out.println(list);
	}
}

运行的结果如下:

[2, 4, 6, 8, 10]

java.util.ConcurrentModificationException

at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)

at java.util.AbstractList$Itr.next(AbstractList.java:343)

at com.TestList.removeTwo(TestList.java:23)

at com.TestList.main(TestList.java:60)

[6, 7, 8, 9, 10]

上面代码逻辑很简单,就是将List集合里的前5个对象删除掉,然而结果却是相当不一样:第一个是错误的结果,第二个直接报异常,只有第三个是我们想要的结果!

那么这是为什么呢?其实主要原因来自于List中的remove()方法。我们来分析一下:

第一种方法:

第一次执行完remove方法后,并不像我们简单想象的那样就把第一个删除了,“1”这个对象被删除了没错,但是当被删除后List中“2”以后的9个对象的index索引也变了,都比原来的值减一,换句话说就是剩下的9个对象的index值为从0到8,而不是原来的从1到9了,那么第二次执行remove方法时,此时list.remove(1)删除的就是“3”这个对象(“3”的index值为1),而不是我们想象的删除“2”对象。

第二种方法:

原因跟上面一样,导致List的next()方法内部出现modCount和expectedModCount不一致导致抛出异常。

所以我们这里建议大家采用第三种方法来删除List集合中某一个对象,这样做是最简单且容易记忆的。那第一种方法和第二种方法有没有解决的办法呢?目前我知道第一种方法的解决办法,第二种应该是无解的(因为语法结构导致)。

第一种方法的改进措施:

void remove(List<Integer> list) {
		int num = list.size() - 5;
		for (int i = 0; i < num; i++) {
			list.remove(i);
			i--;
			num--;
		}
	}

我想你编程时间长了,也会偶尔遇到这些类似简单却让你头疼的问题,遇到这些问题首先检查下自己的逻辑是否有问题,如果逻辑没有问题就检查下代码的结构是否有问题吧,这就是所谓的基本功,以后我也会慢慢的加强巩固自己基本功方面的能力,一起加油吧。

如何从List集合中删除对象

时间: 2024-11-29 06:00:44

如何从List集合中删除对象的相关文章

not(expr|ele|fn)从匹配元素的集合中删除与指定表达式匹配的元素

not(expr|ele|fn) 概述 从匹配元素的集合中删除与指定表达式匹配的元素 参数 exprStringV1.0 一个选择器字符串.深圳dd马达 elementDOMElementV1.0 一个DOM元素 function(index)FunctionV1.4 一个用来检查集合中每个元素的函数.this是当前的元素. 示例 描述: 从p元素中删除带有 select 的ID的元素 HTML 代码: <p>Hello</p><p id="selected&quo

使用JavaScript从数组中删除对象

如何从数组中删除对象? 我希望从someArray删除包含名称Kristian的对象. 例如: someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}]; 我要实现: someArray = [{name:"John", lines:"1,19,26,96"}]; #1楼 在数组上

对list集合中的对象进行排序(转载)

原文链接:http://blog.csdn.net/veryisjava/article/details/51675036 Collections对List集合中的数据进行排序 有时候需要对集合中的元素按照一定的规则进行排序,这就需要用到 Java中提供的对集合进行操作的工具类Collections,其中的sort方法 先看一个简单的例子: public static void main(String[] args) { List<Integer> nums = new ArrayList&l

存储在集合中的对象不应该含有基本数据结构的任何实现细节

开卷有益,最近正按计划巩固自己算法与数据结构的基础知识,目前看来收获开始很多的,重拾了很多遗忘的知识,注意到很多以前没有留意的细节.在复习使用链表实现栈是,注意到了一句话:“链表结构的细节内容应该与链表所存储的元素区分开来”. 我试着去理解这句话中包含的东西,以前我使用的链表大概是这样的: DATA是我们要存储的数据,如果我们想要用DATA实现链表结构,我们需要在DATA中添加一个存储DATA对象地址的变量next.之前我并没有意识到也没有去思考过这种使用方式会有什么缺陷,今天思考了一下,确实发

Lambda+Stream替换集合中每个对象的指定字段值

做某项目用的是mongodb数据库,因为Mongodb不像mysql可以联表查询,导致编码中常常会遇到将数据中无意义的ID值转换为可读的名称值. java8之前我们的代码是这么写的: 现在我们可以这么写: 注释掉的代码是开始想实现的,转念一想stream还有.forEach()方法,可以不用重新构造对象,于是就用了下面的方式. cacheService.parseGroup()做了缓存处理,这样不必每次都查数据库和进行筛查运算了.           参考文档:  http://www.runo

根据List集合中的对象属性排序

首先创建一个Student对象,里面有三个属性,分别是int类型,String类型,Date类型 package com.sinoway.cisp.test; import java.text.SimpleDateFormat; import java.util.Date; public class Student { private int age; private String name; private Date birthday; public int getAge() { return

MongoDB,从数组中删除对象

{ _id: 5150a1199fac0e6910000002, name: 'some name, items: [{ id: 23, name: 'item name 23' },{ id: 24, name: 'item name 24' }] } 删除代码 db.mycollection.update( {'_id': ObjectId("5150a1199fac0e6910000002")}, { $pull: { "items" : { id: 23 }

集合中保存对象,如何按对象中的属性排序?

package testProject; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class TestPro { public static void main(String[] args) { ArrayList<TestPro> zsList = new ArrayList<TestPro>(); zsList.add(new Te

集合框架(去除ArrayList集合中的重复自定义对象元素案例)

学生类 package cn.itcast_04; public class Student { private String name; private int age; public Student() { super(); } public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public v