- foreach存在局限性,在循环遍历数组集合时,只能访问集合中的元素,但不能对其中的元素进行修改
package com.sgl;
public class Test {
static String[] strs = {"aaa","bbb","ccc"};
public static void main(String[] args) {
//String[] strs = {"aaa","bbb","ccc"};
//1.foreach循环遍历数组
for (String str:
strs) {
str = "ddd";
}
System.out.println("foreach循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]);
//foreach循环修改后的数组:aaa,bbb,ccc
//for循环遍历数组
for (int i = 0; i < strs.length; i++) {
strs[i] = "ddd";
}
System.out.println("for循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]);
//foreach循环修改后的数组:aaa,bbb,ccc
}
}
简述:
第六行行代码中的str = "ddd"只是将临时变量str指向了一个新的字符串,这和数组中的元素一点关系都没有。而普通的普通的for循环,是可以通过索引的方式来引用数组中的元素并将其值进行修改
- 在使用Iterator迭代器对集合中的元素进行迭代时,如果调用了集合对象的remove()方法去删除元素时,会出现异常
上代码:
package com.sgl;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
list.add("jack");
list.add("jdad");
list.add("fgdc");
list.add("vfcd");
list.add("gbff");
Iterator<Object> iterator = list.iterator(); //获得Iterator对象
while (iterator.hasNext()){ //判断该集合是否有下一个元素
Object obj = iterator.next(); //获取该集合的元素
if ("jack".equals(obj)){
list.remove(obj); //删除该集合中的元素
}
}
System.out.println(list);
}
}
运行结果:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
at java.util.ArrayList$Itr.next(ArrayList.java:861)
at com.sgl.Test.main(Test.java:17)
发生了修改异常 ConcurrentModificationException,这个异常时迭代器对象抛出的,出现原因时集合中删除了元素会导致迭代器预期的迭代次数发生改变,导致迭代器的结果不准确
解决方案:
- 添加break语句
if ("jack".equals(obj)){
list.remove(obj); //删除该集合中的元素
break;
}
- 将list.romove(obj)改为iterator.remove()
if ("jack".equals(obj)){
iterator.remove(); //删除该集合中的元素