对于集合的遍历操作,可以使用 itrator foreach for 循环,下面比较一下各自的优缺点

本文详细探讨了在Java中使用不同方法从List中删除元素时的注意事项与陷阱,包括直接迭代删除、使用Iterator迭代器及Arrays.asList方法的限制。
List<String> list = new ArrayList<String>();
        list.add("11");
        list.add("11");
        list.add("33");
        list.add("44");
        for (int i =0; i < list.size(); i++) {
            if(list.get(i).equals("11")){
                list.remove(i);
            }
        }
输出:[11,33, 44] 

分析:list底层实现是一个数组,删除一个之后下标发生了左移,发生错误,无论是修改还是删除,不建议使用这种方式

Iterator<String> it = list.iterator();
while(it.hasNext()){
            String temp = (String)it.next();
            if(temp.equals("11")){
                it.remove();
            }
        }
        System.out.println(list.toString());

输出:[33, 44]

分析:为什么这个可以呢?因为itrator的remove()方法有一步:expectedModCount = modCount,删除很方便,但是不能做修改

for(String loop : list){
            if(loop.equals("11")){
                list.remove(loop);
            }
            if(loop.equals("22")){
                list.remove(loop);
            }
        }
        System.out.println(list.toString());

输出: java.util.ConcurrentModificationException

分析:list底层有一个modcount标记,每次进行修改前会加1,再次删除是使用 if (modCount != expectedModCount) 进行判断是否相等,相等才可以操作。不能进行删除,但是可以修改

再补充一个问题:

String[] vendorIdArr = {"11","22","33"};
        List<String> vendorIdResultList = Arrays.asList(vendorIdArr);
        vendorIdResultList.remove(0);
输出:java.lang.UnsupportedOperationException 

分析:java.util.Arrays$ArrayList 没有重写add(), removew()方法 ,使用 List vendorIdResultList = new ArrayList(Arrays.asList(vendorIdArr))代替List vendorIdResultList = Arrays.asList(vendorIdArr)即可

总结:修改使用foreach(),删除使用iterator(),既要删除又要修改只能采做标记的方式,遍历后再根据标记操作,如果非得使用一个方式进行,不是没有,那就是使用for循环,但是是从尾部向头部遍历,这样就可以避免元素删除后未遍历的元素下标发生偏移,但是不建议使用。
当工作逐渐占据了生活的全部,只能从代码中窃取快乐。

### 使用增强型 for 循环foreach遍历数组 增强型 for 循环foreach)是 Java 中用于简化数组和集合遍历的一种语法糖。它通过隐式迭代器的方式访问数组或集合中的每个元素,无需显式地使用索引变量。 以下是一个使用 foreach 遍历整型数组的示例[^1]: ```java public class Use_foreach_遍历 { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6}; for (int i : arr) { System.out.print(i + "\t"); } } } ``` 在上述代码中,`for (int i : arr)` 的含义是:对于数组 `arr` 中的每一个元素,将其赋值给变量 `i`,然后执行循环体内的语句。 除了整型数组,foreach 循环还可以用于其他类型的数组,例如字符串数组[^2]: ```java String[] names = {"Alice", "Bob", "Charlie"}; for (String name : names) { System.out.println(name); } ``` 在上述代码中,`for (String name : names)` 表示对于字符串数组 `names` 中的每一个元素,将其赋值给变量 `name`,然后输出该变量的值。 此外,foreach 循环也可以结合 `Arrays.sort` 方法对数组进行排序后遍历[^4]: ```java import java.util.Arrays; public class HelloWorld { public static void main(String[] args) { int[] scores = {89, 72, 64, 58, 93}; Arrays.sort(scores); for (int score : scores) { System.out.println(score); } } } ``` 在上述代码中,首先对数组 `scores` 进行排序,然后使用 foreach 循环依次输出每个元素的值。 需要注意的是,在使用 foreach 遍历集合时,不能遍历过程中修改集合的内容(如添加或删除元素),否则会抛出 `ConcurrentModificationException` 异常[^5]。如果需要在遍历过程中修改集合,可以使用迭代器的 `remove` 方法。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值