当前位置: 首页 > article >正文

集合遍历的多种方式

目录

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.总结


http://www.kler.cn/a/571260.html

相关文章:

  • vulnhub靶场之【digitalworld.local系列】的JOY靶机
  • LeetCode hot 100 每日一题(3)--128. 最长连续序列
  • 鸿蒙中打开相机相册
  • Electron、Tauri及其它跨平台方案终极对比
  • 腾讯云 | 微搭低代码快速开发数据表单应用
  • C#里定义对象序列化保存的例子
  • 证明:曲线的可导点不能同时为极值点和拐点
  • Nest系列:从环境变量到工程化实践-2
  • 你了解 Java 线程池的原理吗?
  • Beyond Compare for mac v5.0.6.30713 文件对比利器 支持M、Intel芯片
  • 动态规划背包问题
  • Celia智能助手系统架构设计与技术实现全解析
  • 深入探索Python机器学习算法:模型评估
  • 投入与专注
  • 【数据库】数据库基础
  • 视音频数据处理入门:颜色空间(二)---ffmpeg
  • 一周学会Flask3 Python Web开发-在模板中渲染WTForms表单视图函数里获取表单数据
  • 大数据测试总结
  • 简易的微信聊天网页版【项目测试报告】
  • GradingPool-Seq使用方法