当前位置:首页 > 科技  > 软件

Java中不建议使用foreach的六大场景

来源: 责编: 时间:2023-12-12 17:02:54 224观看
导读在Java中,foreach 是一个常用的循环结构,它可以极大地简化遍历数组或集合(例如 List 或 Set)的代码。它通常被认为是一种更加简洁和易读的迭代方式。然而,可能有一些情况下不建议使用 foreach 循环:移除元素: 使用 foreach

在Java中,foreach 是一个常用的循环结构,它可以极大地简化遍历数组或集合(例如 List 或 Set)的代码。它通常被认为是一种更加简洁和易读的迭代方式。然而,可能有一些情况下不建议使用 foreach 循环:tWZ28资讯网——每日最新资讯28at.com

tWZ28资讯网——每日最新资讯28at.com

  1. 移除元素: 使用 foreach 循环时,如果尝试直接从正在遍历的集合中移除元素,可能会抛出 ConcurrentModificationException。这是因为 foreach 循环背后使用的是迭代器,而直接修改集合会导致迭代器的状态与实际的集合状态不一致。在这种情况下,你应该使用显式迭代器并调用 iterator.remove() 方法。
// 使用迭代器来安全地移除集合中的元素:import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class RemoveElement {    public static void main(String[] args) {        List<String> list = new ArrayList<>();        list.add("A");        list.add("B");        list.add("C");        Iterator<String> iterator = list.iterator();        while (iterator.hasNext()) {            String item = iterator.next();            if (item.equals("B")) {                iterator.remove(); // 安全移除元素            }        }        System.out.println(list); // 输出结果将不包含"B"    }}
  1. 性能敏感: 如果你正在处理超大数据集,或者在性能要求非常严格的场景中,foreach 循环可能会引入轻微的性能开销,因为它需要构造一个迭代器对象。对于原始类型的数组,使用传统的 for 循环可以避免自动装箱和拆箱的额外开销,并提供更好的性能。
// 使用传统的for循环处理原始类型数组:public class PerformanceSensitive {    public static void main(String[] args) {        int[] numbers = {1, 2, 3, 4, 5};        // 使用传统 for 循环来避免可能的性能开销        for (int i = 0; i < numbers.length; i++) {            System.out.println(numbers[i]);        }    }}
  1. 需要修改当前元素: 在 foreach 循环中,没有直接的方式来修改当前遍历到的元素,因为所得到的只是一个副本。如果你需要修改列表中的元素,你通常需要使用传统的 for 循环,以便获得元素的索引。
// 通过传统的for循环获取索引并修改数组或列表中的元素:import java.util.ArrayList;import java.util.List;public class ModifyElement {    public static void main(String[] args) {        List<String> list = new ArrayList<>();        list.add("apple");        list.add("banana");        list.add("cherry");        for (int i = 0; i < list.size(); i++) {            list.set(i, list.get(i).toUpperCase());        }        System.out.println(list); // 所有元素变为大写    }}
  1. 需要索引或迭代器: foreach 循环不提供当前元素的索引或迭代器本身。如果你的逻辑需要使用元素的索引,或者你需要在迭代过程中获取迭代器来执行其他操作,你应该使用传统的 for 循环或者直接使用迭代器。
// 使用传统的for循环以获取元素的索引:import java.util.ArrayList;import java.util.List;public class NeedIndex {    public static void main(String[] args) {        List<String> list = new ArrayList<>();        list.add("one");        list.add("two");        list.add("three");        for (int i = 0; i < list.size(); i++) {            System.out.println("Index " + i + ": " + list.get(i));        }    }}
  1. 多个集合并行遍历: 如果你需要同时遍历两个集合,并且它们是相关联的,例如键值对的情况下,使用 foreach 循环可能会变得复杂。在这种情况下,使用传统的 for 循环通常更方便,因为你可以控制多个索引或迭代器。
// 假设有两相关联的集合,一个是键的列表 keys,另一个是值的列表 valuesList<String> keys = Arrays.asList("key1", "key2", "key3");List<String> values = Arrays.asList("value1", "value2", "value3");// 使用传统的 for 循环同时遍历 keys 和 values 集合for (int i = 0; i < keys.size() && i < values.size(); i++) {    String key = keys.get(i);    String value = values.get(i);    System.out.println(key + ": " + value);}
  1. 特定的并发集合: 当使用特定的线程安全集合类,如 CopyOnWriteArrayList 时,foreach 循环由于内部持有整个迭代期间的集合快照,可能会导致预期之外的内存消耗。
import java.util.List;import java.util.concurrent.CopyOnWriteArrayList;public class ForeachCopyOnWriteExample {    public static void main(String[] args) {        // 使用 CopyOnWriteArrayList 创建线程安全的 ArrayList        List<String> list = new CopyOnWriteArrayList<>();        list.add("Element1");        list.add("Element2");        list.add("Element3");        // 使用 foreach 循环遍历 CopyOnWriteArrayList        for (String element : list) {            System.out.println(element);            // 此处修改集合内容不会影响迭代,因为使用的是集合快照            list.add("ElementNew");        }        // 最后打印集合的内容,可以看到新元素已经被添加        System.out.println("After modifications:");        for (String element : list) {            System.out.println(element);        }    }}

CopyOnWriteArrayList 类创建了一个线程安全的集合。当我们在 foreach 循环中遍历集合并同时向其中添加新元素时,由于 CopyOnWriteArrayList 内部实现了对原始集合的复制(即创建了快照),foreach 循环使用的是开始迭代时的集合状态,所以迭代过程中集合状态的改变不会影响到迭代本身。这可能导致大量内存的额外消耗,尤其是当集合很大时。tWZ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-43330-0.htmlJava中不建议使用foreach的六大场景

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Matplotlib中的titles(标题)、labels(标签)和legends(图例)

下一篇: 测试左移与提测流水线的应用实践

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 影音体验是真的强 简单聊聊iQOO Pad

    影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 2023 年的 Node.js 生态系统

    2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 在线图片编辑器,支持PSD解析、AI抠图等

    在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 2天涨粉255万,又一赛道在抖音爆火

    2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • Windows 11发布,微软一改往常对老机型开放的态度

    Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • “买真退假” 这种“羊毛”不能薅

    “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top