java47集合添加、删除元素报并发修改异常&ArrayList数据结构分析&工具类思想

1.
1.List集合根据角标获取元素

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

public class List集合 {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
	List list = new ArrayList();
	list.add("a");
	list.add("b");
	list.add("c");
	System.out.println(list);
	//在集合中插入数据
	list.add(1,"WW");
	System.out.println(list);//index<=数据长度
	//获取指定角标的元素
	System.out.println(list.get(2));
	//遍历list集合
	System.out.println("---------------------");
	for(int i=0;i<list.size();i++) {
		System.out.println(list.get(i));
	}
}
}
【
[a, b, c]
[a, WW, b, c]
b
---------------------
a
WW
b
c
】

· List集合删除元素【并发修改异常】

迭代过程中,不可直接改变集合的结构【本来1,2,3,4,现在1,3,4,报错】
但迭代器本身有删除器【用来删除本身正在遍历的元素】
在ArrayList中每次调用next时(输出下一个元素),都会判断modCount是否 = expectedModCount
如果不相等则会抛出异常
modCount :集合修改次数(比如该例=4)
expectedModCount :迭代器中记录的集合修改的次数(比如该例=4)

而调用it.remove();它则会让modCount = expectedModCount
若想添加元素,不能借助迭代器

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

public class 并发异常 {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
·List集合删除元素并发异常
	List list = new ArrayList();
	list.add("1");
	list.add("2");
	list.add("3");
	//删除集合中的数字2
	Iterator it =list.iterator();
	//1.确定是否还有元素
	while (it.hasNext()) {
		//2.取出元素,(放在迭代器中的元素是Object类型,取出来后需要转型为对应需要的类型【即向下转型】)
		String str = (String)it.next();
			//3.找到元素2
			if(str.equals("2")) {
				//4.删除元素2
				//list.remove("2");
				it.remove();	
                                //同样添加元素也会报错
                                //list.add("456");//List集合添加元素并发异常
		}
	}
	System.out.println(list);
【[1, 3]】
·List集合添加元素**解决**并发异常,list有专门的listIterator来增加元素
	ListIterator it2 = list.listIterator();
	while(it2.hasNext()) {
		String str2 = (String)it2.next();
		if(str2.equals("1")) {//在此元素之后添加数据
			it2.add("456");
		}
	}
	System.out.println(list);
}
}
【[1, 456, 3]】
· ListIterator的向前遍历集合方法
	while(it2.hasPrevious()) {
		System.out.print("preindex = "+ it2.previousIndex());
		System.out.println(",元素为" + it2.previous());
	}
【preindex = 2,元素为3
preindex = 1,元素为456
preindex = 0,元素为1
】

ArrayList数据结构分析

查找比较快
添加删除比较慢

去除一个集合中的重复元素

import java.util.ArrayList;
import java.util.ListIterator;

public class 去除重复元素 {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
	ArrayList al = new ArrayList();
	al.add("a");
	al.add("a");
	al.add("b");
	al.add("b");
	al.add("c");
	al.add("e");
	//创建一个空的集合
	ArrayList al2 = new ArrayList();
	//取出每一个元素(遍历)
	ListIterator it = al.listIterator();
	while(it.hasNext()) {
		//每取出一个元素,要判断新集合中是否有相同元素 
		Object obj = it.next();
		//如果没有重复,则放入新集合
		if(!al2.contains(obj)) {
			al2.add(obj);
		}
	}
	System.out.println(al2);	
}
}
【[a, b, c, e]】

可以将此写成一个工具类

import java.util.ArrayList;
import java.util.ListIterator;

public class 去除重复元素 {
	static ArrayList getSingle(ArrayList al) {
		//创建一个空的集合
		ArrayList al2 = new ArrayList();
		//取出每一个元素(遍历)
		ListIterator it = al.listIterator();
		while(it.hasNext()) {
			//没取出一个元素,要判断新集合中是否有相同元素 
			Object obj = it.next();
			//如果没有重复,则放入新集合
			if(!al2.contains(obj)) {
				al2.add(obj);
			}
		}
		//System.out.println(al2);
		return al2;
	}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
	ArrayList al = new ArrayList();
	al.add("a");
	al.add("a");
	al.add("b");
	al.add("b");
	al.add("c");
	al.add("e");
	ArrayList list = getSingle(al);
	System.out.println(list);
	ArrayList al2 = new ArrayList();
	al2.add("a");
	al2.add("a");
	al2.add("c");
	al2.add("c");
	al2.add("e");
	ArrayList list2 = getSingle(al2);
	System.out.println(list2);
}
}
【[a, b, c, e]
[a, c, e]】
posted @ 2019-08-20 10:44  不断寻找  阅读(239)  评论(0编辑  收藏  举报