测试场景:
通过List集合ArrayList集合对象,如果当前集合中存在"world"元素,那么就给集合中添加一个"javaEE"元素,最后将集合中的所有元素进行遍历!
1、首先我们先创建一个list集合,插入元素;
public class ListTest {
public static void main(String[] args) {
//创建List集合对象
List<String> list = new ArrayList<>() ;
//给添加元素
list.add("hello");
list.add("world");
list.add("javaee");
//集合的三种遍历方法
//toArray遍历
Object[] objects = list.toArray();
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
//迭代器遍历
Iterator<String> it = list.iterator();
while (it.hasNext()){
String next = it.next();
System.out.println(next);
}
//set() + get()
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//list特有迭代器
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()){
System.out.println(listIterator.next());
}
//增强for循环,替代集合中迭代器去遍历集合使用的(优先在集合中使用)
if(list!=null){
for(String s:list){//获取迭代器
System.out.println(s+"---"+s.length());
}
}else{
System.out.println("当前集合对象为null了");
}
System.out.println(list);
}
}
2、使用迭代器进行对集合操作
//使用迭代器对集合进行遍历插入元素
Iterator<String> it = list.iterator(); //"hello","world","javaee"
while(it.hasNext()){
String s = it.next() ;//"hello","world","javaee"
//判断
if("world".equals(s)){
list.add("javaEE") ;//集合对象添加的元素,迭代器不知道
}
}
System.out.println(list);
//抛出以下异常
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.qf.list_01.ListTest2.main(ListTest2.java:74)
产生异常的原因:
集合在使用迭代器时会经常出现此异常,当集合的元素正在被迭代器进行遍历,那么集合对象是不能够对元素进行增加或者删除 (一个线程正在遍历,一个线程在修改元素)
3、处理措施
1)使用列表迭代器去完成动作 -- ListIterator
//列表迭代器ListIterator
ListIterator<String> lit = list.listIterator();
while(lit.hasNext()){
//获取
String s = lit.next();
//判断是否存在"world"元素
if("world".equals(s)){
//列表迭代器添加
lit.add("javaEE");
}
}
2)集合遍历,集合添加 -- size get add
//集合进行操作 size get add
for(int x = 0 ; x < list.size(); x ++){
String s = list.get(x);
if("world".equals(s)){//将常量放前面,防止出现NullPointerException
list.add("javaEE");
}
}
注:使用equales方法时需注意,将常量放前面,防止出现NullPointerException