集合遍历的多种方式

目录

1.增强for

2.迭代器(在遍历的过程中需要删除元素,请使用迭代器)

3.双列集合

4.Lambda表达式(forEach方法)

1.单列集合:

2.双列集合:

4.Stream 流

5.普通for循环

6.列表迭代器

7.总结


1.增强for

注:增强for遍历集合的内部不要对集合本身做更改,如remove。

如:

for (EnergyWorkshop energyWorkshop : energyWorkshopList) {
    //根据车间名称查询车间信息
    EnergyWorkshop energyWorkshop1 = 
    energyWorkshopMapper.selectWorkshopByWorkshopName(energyWorkshop.getWorkshopName());
    if(ObjectUtil.isNotNull(energyWorkshop1)){
        //String workshopName = energyWorkshop1.getWorkshopName();
        energyWorkshopList3.add(energyWorkshop1);
        //移除掉和数据库的数据同名称的
        energyWorkshopList.remove(energyWorkshop);
    }
}

在遍历energyWorkshopList同时对其进行修改(通过remove方法)。这是非常危险,因为在迭代过程中修改集合会导致ConcurrentModificationException(并发修改异常)。这是因为Java的迭代器在迭代开始时会记录一个快照(称为modCount),当集合被修改时,这个快照会改变。如果迭代器发现快照与它开始迭代时的快照不匹配,就会抛出ConcurrentModificationException

可以用迭代器解决!

Iterator<EnergyWorkshop> iterator = 
                            energyWorkshopList.iterator();
while (iterator.hasNext()) {
    EnergyWorkshop energyWorkshop = iterator.next();
    EnergyWorkshop energyWorkshop1 = 
        energyWorkshopMapper.selectWorkshopByWorkshopName(energyWorkshop.getWorkshopName());
    if (ObjectUtil.isNotNull(energyWorkshop1)) {
        energyWorkshopList3.add(energyWorkshop1);
        iterator.remove(); //安全地删除元素
    }
}

2.迭代器(在遍历的过程中需要删除元素,请使用迭代器)

迭代器在遍历集合的时候是不依赖索引的。

举例:


迭代器的细节注意点:

1.报错NoSuchElementException

2.迭代器遍历完毕,指针不会复位(如果还想第二次遍历集合,则需要再次创建一个新的迭代器来遍历)

3.循环中只能用一次next方法(next()方法 和 hasNext()方法 使用的时候要一一对应)

4.迭代器遍历时,不能用集合的方法进行增加或者删除。(应该用迭代器的方法去操作)

3.双列集合

以上两种方法都是适用于单列集合,双列集合使用的话要先做一些前置操作

(提取"键"或者提取"键值对")

4.Lambda表达式(forEach方法)

1.单列集合:
list.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});

//lambda表达式形式
list.forEach(s -> System.out.println(s));

//Set集合
set.forEach( s -> System.out.println(s));

List单列集合:forEach方法的底层是普通for循环

Set单列集合:forEach方法的底层是增强for

2.双列集合:
map.forEach(new Biconsumer<String, String>() {
    @Override
    public void accept(string key, string value) {
        System.out.println(key + "=" + value);
    }
});
map.forEach((key, value) -> 
            System.out.println(key + "=" + value));

方法的底层:entrySet()方法 + 增强for + getKey() + getValue()

4.Stream 流

本质就是Lambda表达式。。。

5.普通for循环

只有 List接口下的集合 有索引,所以只有List集合能使用普通for循环去遍历

6.列表迭代器

只有List接口下的集合才可以用这种方法遍历。

举例:

获取一个列表迭代器的对象,里面的指针默认也是指向0索引的。

列表迭代器相比迭代器的特殊之处:

它额外添加了一个方法:在遍历的过程中,可以添加元素。

ListIterator<string> it = list.listIterator();
while(it.hasNext()){
    String str = it.next();
    if("bbb".equals(str)){
        it.add("qqq");
    }
}
System.out.println(list);

7.总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值