天天看点

遍历List容器时,元素不是你想删,想删就能删!

今天在做一道编程题时,碰到了一些问题,题目要求写一个简易的个人信息管理系统,有一个删除功能,要求根据用户名查找到该用户对象,并将其删除,我第一次书写的代码是:

<span style="font-size:14px;">for (User u : al) {
			if (u.getName().equals(name)) {
				System.out.println("确定要删除此人吗?(1:确定,0:取消)");
				if (sc.nextInt() == 1) {
					al.remove(u);
					System.out.println("删除成功!");
				}
			} else{
				System.out.println("无此人信息");
			}
		}</span>
           

运行时结果报了一个Exception in thread "main" java.util.ConcurrentModificationException异常,搞了半天没想明白怎么回事,于是去网络上搜了一下,发现很多写代码的菜鸟都碰到了这个问题,看了好多人的解答和心得,获益良多,总结一下就是,这是一个并发修改异常,抛出异常的原因是,在List中,不允许遍历的同时进行删除操作,至于为什么不允许,我没有彻底搞懂,大概原因是,在API里,List等容器的实现并没有同步化,而若要修改就必须要实现外部操作同步化(其实跟没说一样,我也还是不太懂).

至于解决的方法,有两种:

第一个方法,创建一个新的list专门存放要被删除的list对象,在遍历时,把符合删除要求的对象存放进新建的list中,便利完成时,调用list.removeAll()方法,全部删除.不过这种方法,实现起来不够利索,比较臃肿,对于程序员来说是不能容忍的.

第二个方法比较传统,但更值得提倡,就是用Iterator类来遍历list元素,并使用iterator.remove();方法来删除,我修改后的代码为:

<span style="font-size:14px;">Iterator<User> it = al.iterator();
		while (it.hasNext()) {
			User u = it.next();
			if (u.getName().equals(name)) {
				System.out.println("确定要删除此人吗?(1:确定,0:取消)");
				if (sc.nextInt() == 1) {
					it.remove();
					System.out.println("删除成功!");
				}
			} else {
				System.out.println("11无此人信息");
			}
		}</span>
           

问题完美解决,感谢万能狗哥.