对集合的删除为什么要使用迭代器
先看看如果不使用迭代器的情况:
1.增强for循环中使用remove删除
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
for(String s:list){
if(s.equals("5")){
list.remove(s);
}
}
System.out.println(list);
结果:
Exception in thread “main” java.util.ConcurrentModificationException
modCount是指这个list对象从new出来到现在被修改次数,当调用List的add或者remove方法的时候,这个modCount都会自动增减;
expectedModCount是指Iterator现在期望这个list被修改的次数是多少次。
在iterator的next方法中会判断modCount和expectedModCount是否相等不相等就抛异常
.` public static void main(String[] args) {
List<String>list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
list.add("f");
for (int i=0;i<list.size();i++){
if(list.get(i).equals("d")){
list.remove(i);
}
}
for (int j=0;j<list.size();j++){
System.out.println(list.get(j)+"***");
}
}
结果:
a***
b***
d***
d***
d***
f***
结论:
这种方法虽然不会抛异常但是相同两个要删除的元素连续出现只能删除一个,会出现漏掉要删除的元素;
正确方式:Iterator迭代器
Iterator<String> iterator=list.iterator();
while(iterator.hasNext())
{
if(iterator.next().equals("d")){
iterator.remove();
}
}
1、当创建完成指向某个集合或者容器的Iterator对象是,这是的指针其实指向的是第一个元素的上方,即指向一个 空
2、当调用hasNext方法的时候,只是判断下一个元素的有无,并不移动指针
3、当调用next方法的时候,向下移动指针,并且返回指针指向的元素,如果指针指向的内存中没有元素,会报异 常。
4、remove方法删除的元素是指针指向的元素。如果当前指针指向的内存中没有元素,那么会抛出异常。
还没有评论,来说两句吧...