软件构造记录-集合的遍历

自从知道了增强for循环,本人在写java代码遍历集合时使用的几乎都是这种方法,但有时会出现一些意料之外的错误。因此在网上搜集了几种集合遍历的方式,以应对各种需要的场景。

遍历方式

假设需要遍历的集合为:

List<String> listNames = new ArrayList<>();

1. 经典循环方式

最简单且容易理解的方式,多数语言都使用这种方式遍历集合

        for (int i = 0; i < listNames.size(); i++) {
            String name = listNames.get(i);
            System.out.println(name);
        }

 

2. 加强for循环

本人最常用的方式,在编译过程会将其转化为 "使用下标遍历" 的方式,在字节码层面其实等价于第一种方式,效率上也没有太大差别。好处主要就是代码简洁。

        for (String s : listNames) {
            System.out.println(s);
        }

 

3. 迭代器

由于经典循环方式的限制,创建了使用迭代器的方式,这种方式允许我们迭代各种集合。因此你可以看到Collection接口定义了每个集合必须实现iterator()方法

        Iterator<String> itr = listNames.iterator();

        while (itr.hasNext()) {
            String name = itr.next();
            System.out.println(name);
        }

对于其他集合也同理:

Set:

        Set<String> set = new HashSet<>();

        set.add("a");
        set.add("b");
        set.add("c");
        set.add("d");

        Iterator<String> itr = set.iterator();

        while (itr.hasNext()) {
            String letter = itr.next();
            System.out.println(letter);
        }

Map:

        Map<String, Integer> grade = new HashMap<>();

        grade.put("Operating System", 90);
        grade.put("Computer Network", 92);
        grade.put("Software Engineering", 90);
        grade.put("Oracle", 90);

        Iterator<String> itr = grade.keySet().iterator();

        while (itr.hasNext()) {
            String key = itr.next();
            Integer value = grade.get(key);
            System.out.println(key + "=>" + value);
        }

 遇到的错误

开篇提到使用增强for循环的遍历模式可能会遇到错误,那就是循环中删除:

for (String s: listName) {
        if (s.equals(del)) {
            listName.remove(s);
        }
    }

如果这样写,你会遇到java.util.ConcurrentModificationException异常。刚碰到的时候你可能会感觉很困惑,但其实转换成经典for循环的方式就很好理解了:删除元素导致数组下标被改变了。

实际上正确的经典for循环可以是这样的:

for (int i = 0; i < listName.size(); i++) {
        String s = listName.get(i);
        if (s.equals(del)) {
            listName.remove(i);
            i = i - 1;
        }
    }

只需要修正数组下标就可以了。

更简单也更常用的方法是使用迭代器的删除:

        Iterator<String> itr = listNames.iterator();

        while (itr.hasNext()) {
            String name = itr.next();
            if (name.equals(del)) {
                itr.remove();
            }
        }

迭代器会自动修正数组。一般写代码需要删除时我会选择这种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值