您的位置:首页 > 其它

遍历集合,判断并添加元素的集中方法

2016-03-01 07:53 435 查看
/*
 * 需求:遍历集合,如果集合中有world这个元素,我就在添加一个元素:android
 * 
 * java.util.ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 并发修改异常。
 * 
 * 这个时候,为什么会报错呢?
 * 回想一下,迭代器是怎么存在的。
 * 先有集合,才有迭代器,迭代器是依赖于集合而存在。
 * 而我们现在,是在使用迭代器的同时,通过集合去修改了集合元素。这个时候,集合的内部就发生了改变,
 * 而迭代器并不知道这些,所以,再次迭代的时候就报错了,错误的原因:你在用迭代器迭代的时候,用集合修改了集合中的元素。
 * 
 * 解决问题方案:
 * A:用迭代器迭代,用迭代器修改集合元素
 * <span style="white-space:pre">		</span>这个时候,元素是直接添加到查找的元素后面,不是在末尾处添加。
 * B:用集合遍历,用集合修改集合元素
 * <span style="white-space:pre">		</span>这个时候,元素是在集合的末尾添加。
 * <span style="white-space:pre">		</span>你有没有听说过并发修改异常?如果有,请问在哪里见过?怎么产生的?怎么解决的?
 */


List<String> list2 = new ArrayList<>();
list2.add("hello");
list2.add("world");
list2.add("Java");

// 方式1 不可用
// Iterator<String> iterator2 = list2.iterator();
// // java.util.ConcurrentModificationException 并发修改异常
// while (iterator2.hasNext()) {
// String string = iterator2.next();
// if ("world".equals(string)) {
// list2.add("we");
// }
// }
// 方式2 不可用
// // java.util.ConcurrentModificationException
// for (String string : list2) {
// if ("Objective-c".equals(string)) {
// list2.add("swift");
// }
// }

// 方式3 可用
ListIterator<String> lIterator = list2.listIterator();
while (lIterator.hasNext()) {
String string = lIterator.next();
if ("world".equals(string)) {
System.out.println("----------------------");
lIterator.add("Objective-c");
// [hello, world, Objective-c, Java]
}

}
System.out.println(list2);

// 方式4 可用的
for (int i = 0; i < list2.size(); i++) {
String string = list2.get(i);
if ("Objective-c".equals(string)) {
list2.add("swift");
// [hello, world, Objective-c, Java, swift]

}
}
System.out.println(list2);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: