Collection -- List 的独特于并发修改错误

一,结构

java.util
接口 List<E>

所有超级接口:

Collection<E>, Iterable<E>

List 是Collection的子接口,包含了Collection的基本方法函数,这里就只介绍一些List专有的方法

list 即有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

 

二,专有方法

void add (int index, E element)
E remove(int index)
E get(int index)
E set(int index, E element)

1.void add (int index, E element)  

在列表的指定位置插入指定元素(可选操作)。将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(在其索引中加 1)。

2.E remove(int index)   

移除列表中指定位置的元素(可选操作)。将所有的后续元素向左移动(将其索引减 1)。返回从列表中移除的元素。

3.E get(int index)     返回列表中指定位置的元素。

4.E set(int index, E element)  用指定元素替换列表中指定位置的元素

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		
		list.add(1, "e");                   //按照索引插入元素        index <= size 并且 
        index >= 0 都不会异常
		 //list.add(10, "2");             java.lang.IndexOutOfBoundsException,当存储时使用 
                                          //不存在的索引时,要考虑索引越界问题
		System.out.println(list);
		
		list.remove(1);                 //通过索引删除元素 返回删除的元素  注意: 删除时不会 
                                        //自动封箱,区别索引与封箱元素,避免混乱
		list.remove("a");               //可以直接通过元素删除  删除成功返回true 失败 false
		System.out.println(list.remove("d"));
		System.out.println(list);
		
		Object obj1 = list.get(1);         //获取指定位置元素的值   存在索引越界问题
		System.out.println(obj1);
		//通过索引遍历List集合
		for(int i =0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		list.set(1,"W");               //将指定位置元素修改
		System.out.println(list);
	}

三,遍历

向List集合中存储学生对象,通过size() 和 get() 方法结合使用遍历

public static void main(String[] args) {
		List list = new ArrayList();
		list.add(new Student("张三",21));
		list.add(new Student("李四",31));
		list.add(new Student("王五",41));
		list.add(new Student("赵六",31));
		
		for(int i = 0; i < list.size(); i++) {
			Student s = (Student) list.get(i);     //向下转型
			System.out.println(s.getAge() + "   "  + s.getName());
			System.out.println(list.get(i));
		}
	}

四,并发修改错误

在使用iterator 迭代器进行遍历集合时同时使用collection - List 中add方法添加元素,就会发生并发修改错误,因为iterator迭代器在迭代开始时接收n个元素,遍历时元素变为n + 1 个就会发生混乱,造成并发修改错误

即java.util.ConcurrentModificationException

public static void main(String[] args) {
		List list = new ArrayList();     //父类引用实现子类对象
		list.add("world");
	    list.add("a");
	    list.add("c");
		if(list.contains("world")) {
			list.add("javaeej");
		}
	System.out.println(list);
	
	Iterator it = list.iterator();
	while(it.hasNext()) {
		String str = (String) it.next();       
                                          //java.util.ConcurrentModificationException
		if("world".equals(str)) {
		//	list.add("javaee");                     //遍历的同时在增加元素,并发修改错误,因 
                                        //为iterator接收到a给元素,在遍历时添加会影响到 
                                        //iterator的遍历数,所以会产生并发修改错误
		}
	}
	System.out.println(list);
	
	ListIterator lit = list.listIterator();
	while(lit.hasNext()) {
		String str = (String) lit.next();           //向下转型
		if("world".equals(str)) {
			lit.add("javaee");             //遍历的同时仍然可以增加元素,元素添加在遍历索引后
		}
	}
	System.out.println(list);
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

§九千七§

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值