社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
在集合中有三种遍历方式 for循环,迭代器,和foerach 这三种在删除中方式一样吗?
下面分别对其进行探讨
1 for循环
for循环是一种普遍的循环,有索引 下面通过代码进行了解
import java.util.ArrayList;
public class DeleteDemo {
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<>();
array.add(1);
array.add(2);
array.add(2);
array.add(3);
for(int i=0;i<array.size();i++){
if(2==array.get(i)){
array.remove(i);
}
}
}}
看看运行结果
为什么 有一个2 没有被删除呢,当我们深究 for循环在集合中工作原理就可以理解,事实上,当删除一个元素时,后面元素的索引就会前进以为,如删除第一个2 时候,此时下一个元素2的索引就变成了1,而此时for循环执行i++,对应索引的位置为2 而新的1索引上的值就不会在读取了,所以结果为【1,2,3】,要解决这个问题很容易只需要把 array.remove(i);改为 array.remove(i);即可 即
import java.util.ArrayList;
public class DeleteDemo {
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<>();
array.add(1);
array.add(2);
array.add(2);
array.add(3);
for(int i=0;i<array.size();i++){
if(2==array.get(i)){
array.remove(i--);
}
}
}}
输出结果为
2迭代器Iterator遍历删除
iterator方法是集合中的方法,通过代码即可清楚了解
import java.util.ArrayList;
import java.util.Iterator;
public class DeleteDemo {
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<>();
array.add(1);
array.add(2);
array.add(2);
array.add(3);
Iterator<Integer> it = array.iterator();
while (((Iterator) it).hasNext()){
if (2==it.next()){
it.remove();
}
}
System.out.println(array);}}
结果是
我们发现我们用的remove()方法是迭代器的 事实上集合也有remove()方法,如果我们用集合的remove()方法会怎么样呢 下面直接给出结果
意思是迭代器并发修改异常,出现这个原因是 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection(来自java API),从这里可以看出迭代器和集合是在不同线程里的。查看资料知道了,迭代器其实在另外一个线程复制了一个一摸一样的集合进行遍历的。当用集合的remove方法删除元素时,迭代器是不会知道的,所以就会抛出异常。而用自己的方法时 迭代器时知道的。
我们再接着看上述代码,我们想如果是想分别打印出元素,不包括删除的元素怎么办,这时候我们可能想到下列代码
import java.util.ArrayList;
import java.util.Iterator;
public class DeleteDemo {
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<>();
array.add(1);
array.add(2);
array.add(2);
array.add(3);
Iterator<Integer> it = array.iterator();
while (((Iterator) it).hasNext()){
if (2==it.next()) {
it.remove();
}
System.out.println(it.next());
}
结果是
为什么是这样呢,那是因为我们用了两次it.next() 那么要想满足条件该怎么办呢? 看了上次错误原因我们想只用一个it.next()就好了。此时修改下代码即可解决
import java.util.ArrayList;
import java.util.Iterator;
public class DeleteDemo {
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<>();
array.add(1);
array.add(2);
array.add(2);
array.add(3);
Iterator<Integer> it = array.iterator();
while (((Iterator) it).hasNext()) {
int b = it.next();
if (2 != b) {
it.remove();
System.out.println(b);
}
}
}
}
结果是
3 foreach循环
foreach循环一种很方便的循环 但是没有索引 那么可以在集合中可以修改吗? 很遗憾不可以 我们用代码演示下
import java.util.ArrayList;
public class DeleteDemo {
public static void main(String[] args) {
ArrayList<Integer> array = new ArrayList<>();
array.add(1);
array.add(2);
array.add(2);
array.add(3);
for (Integer a:array) {
if (2==a){
array.remove(a);
}
System.out.println(a);
}
}
}
结果是
这个原因我们解释过 因为它自身不带删除方法,所以 这个不可以删除元素。
总结:在只是便利情况下,我们三个都可以用,在修改集合的情况下,不用第三个foreach
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!