List集合循环遍历删除修改保存内容的测试:以及报错:ConcurrentModificationException

package com.taotao.cart.controller;

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

import com.taotao.manager.pojo.TbItem;
/**
 * List 集合中保存数据的修改和移除
 * -----------------测试一-------------------
 *   * 测试使用增强for循环删除和修改List保存对象
	 * 	1 移除list内的对象:
	 * 		1.1 循环删除多个对象时:报错java.util.ConcurrentModificationException
	 * 		1.2 只删除一个对象,然后使用break停止循环,则不报错
	 * 	2 修改内容不报错
 * -----------------测试二-------------------
 * 	 * 测试使用普通for循环删除和修改List保存对象
	 * 	1 移除list内的对象:
	 * 		1.1 升序循环
	 * 			1.1.1 循环删除多个对象时:不报错,但是数据有较大误差
	 * 			1.1.2 只删除一个对象,然后使用break停止循环:则不报错,且数据正确
	 * 		1.2 降序循环
	 * 			删除多个或一个都不报错,且数据准确
	 * 	2 修改内容不报错
 * 
 * -----------------测试三-------------------
 * 	 * 测试使用Iterator循环删除和修改List保存对象
	 * 	1 使用list移除其内的对象:
	 * 		1.1 移除多个 :报错java.util.ConcurrentModificationException
	 * 		1.2 移除一个 :不报错,数据正常
	 * 	2 使用Iterator移除list中的对象: 
	 * 		2.1 移除多个 :正确不报错
	 * 		2.2 移除一个:正确不报错
	 * 	3 修改内容不报错: 正确不报错
 * @Description 
 * @ClassName Tes
 * @Author [浅醉]
 * @Date 2019年2月27日 下午2:12:07
 */
public class Tes {
	public static void main(String[] args) {
		//test1();
		//test2();
		test3();
	}
	/**
	 * 测试使用增强for循环删除和修改List保存对象
	 * 	1 移除list内的对象:
	 * 		1.1 循环删除多个对象时:报错java.util.ConcurrentModificationException
	 * 		1.2 只删除一个对象,然后使用break停止循环,则不报错
	 * 	2 修改内容不报错
	 * 
	 */
	public static void test1(){
		List<Person> list = new ArrayList();
		Person p1 = new Person("张三", 1);
		Person p2 = new Person("李四", 2);
		Person p3 = new Person("王二", 3);
		
		list.add(p1);
		list.add(p2);
		list.add(p3);
		System.out.println(list.size());
		for(Person temp : list){
			
			
			/*-----------1.1 循环删除多个数据报错------------*/
			//list.remove(temp); 循环删除多个数据报错
			
			/*-----------1.2  删除一个数据,然后停止循环,则不报错------------*/
			if(temp.getName().equals("李四")){
				list.remove(temp);
				break;   
			}
			/*-----------1.3  修改数不报错------------*/
			//temp.setName("liili"); 
		}
		for(Person temp : list){
			System.out.println(temp.getName());
			
		}
		System.out.println(list.size());
	}
	/**
	 * 测试使用普通for循环删除和修改List保存对象
	 * 	1 移除list内的对象:
	 * 		1.1 升序循环
	 * 			1.1.1 循环删除多个对象时:不报错,但是数据有较大误差
	 * 			1.1.2 只删除一个对象,然后使用break停止循环:则不报错,且数据正确
	 * 		1.2 降序循环
	 * 			删除多个或一个都不报错,且数据准确
	 * 	2 修改内容不报错
	 * 
	 */
	public static void test2(){
		List<Person> list = new ArrayList();
		Person p1 = new Person("张三", 1);
		Person p2 = new Person("李四", 2);
		Person p3 = new Person("王二", 3);
		
		list.add(p1);
		list.add(p2);
		list.add(p3);
		System.err.println("操作前list集合大小:"+list.size());
		
		/*----------1.1.1 循环删除多个对象时:不报错,但是数据有较大误差------------*/
		
		/*for(int i = 0;i<list.size();i++){
			System.out.println("list的实时大小:"+list.size());
			System.out.println("被删除的数据:"+list.get(i).getName());
			list.remove(i);
		}*/
		/* 结果: 并没有全部删除,仍剩下一个数据 李四。
		 * 		是因为在循环删除时list集合大小变化了,而且数据的下标也变化了:
		 * 		张三的下标是0,当删除后李四的下标变成了0;王二的变成了1 ,故删除了王二,留下了李四。这是有错误的。
		 	3
			被删除的数据:张三
			被删除的数据:王二
			1
		 */
		
		/*----------1.1.2 只删除一个对象,然后使用break停止循环,则不报错,且数据正确------------*/
		
		/*for(int i = 0;i<list.size();i++){
			if(list.get(i).getName().equals("李四")){
				System.out.println("被删除的数据:"+list.get(i).getName());
				list.remove(i);
				break;
			}
		}*/
		
		/*----------1.2.1 降序循环 :循环删除多个数据,不报错,数据准确------------*/
		/*for(int i = list.size()-1;i>-1;i--){
			System.out.println("list的实时大小:"+list.size());
			System.out.println("被删除的数据:"+list.get(i).getName());
			list.remove(i);
		}
		*/
		
		/*----------1.2.2 降序循环 :删除一个数据,break。不报错,数据准确------------*/
		for(int i = list.size()-1;i>-1;i--){
			if(list.get(i).getName().equals("李四")){
				System.out.println("被删除的数据:"+list.get(i).getName());
				list.remove(i);
				break;
			}
		}
		
		
		
		System.err.println("操作后list集合大小:"+list.size());
	}
	/**
	 * 测试使用Iterator循环删除和修改List保存对象
	 * 	1 使用list移除其内的对象:
	 * 		1.1 移除多个 :报错java.util.ConcurrentModificationException
	 * 		1.2 移除一个 :不报错,数据正常
	 * 	2 使用Iterator移除list中的对象: 
	 * 		2.1 移除多个 :正确不报错
	 * 		2.2 移除一个:正确不报错
	 * 	3 修改内容不报错: 正确不报错
	 * 
	 */
	public static void test3(){
		List<Person> list = new ArrayList();
		Person p1 = new Person("张三", 1);
		Person p2 = new Person("李四", 2);
		Person p3 = new Person("王二", 3);
		
		list.add(p1);
		list.add(p2);
		list.add(p3);
		System.err.println("操作前list集合大小:"+list.size());
		
		/*----------1.1 使用list移除其内多个对象: java.util.ConcurrentModificationException------------*/
		/*Iterator<Person> iterator = list.iterator();
		int i = 0;
		while(iterator.hasNext()){
			Person person = iterator.next();
			list.remove(person);
		}*/
		
		
		/*----------1.2 使用list移除其内一个对象:不报错,数据正常------------*/
		Iterator<Person> iterator = list.iterator();
		while(iterator.hasNext()){
			Person person = iterator.next();
			if(person.getName().equals("李四")){
				list.remove(person);
				break;
			}
		}
		
		
		/*----------2.1 使用iterator移除其内多个对象:不报错,数据正常 ------------*/
		/*Iterator<Person> iterator = list.iterator();
		while(iterator.hasNext()){
			System.out.println("list实施大小:"+list.size());
			Person person = iterator.next();
			iterator.remove();
		}*/
		
		/*----------2.2 使用iterator移除其内一个对象:不报错,数据正常 ------------*/
	/*	Iterator<Person> iterator = list.iterator();
		while(iterator.hasNext()){
			Person person = iterator.next();
			if(person.getName().equals("李四")){
				iterator.remove();
				break;
			}
		}*/
		
		
		/*----------3 使用iterator循环是时,修改数据: 正确不报错------------*/
		/*Iterator<Person> iterator = list.iterator();
		while(iterator.hasNext()){
			Person person = iterator.next();
			person.setName("lili");
		}
		
		Iterator<Person> iterator2 = list.iterator();
		while(iterator2.hasNext()){
			Person person2 = iterator2.next();
			System.out.println(person2.getName());
		}*/
		
		System.err.println("操作后list集合大小:"+list.size());
	}
}
class Person{
	private String name;
	private Integer id;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Person(String name, Integer id) {
		super();
		this.name = name;
		this.id = id;
	}
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值