日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Java中不建議使用foreach的六大場景

來源: 責編: 時間:2023-12-12 17:02:54 303觀看
導讀在Java中,foreach 是一個常用的循環結構,它可以極大地簡化遍歷數組或集合(例如 List 或 Set)的代碼。它通常被認為是一種更加簡潔和易讀的迭代方式。然而,可能有一些情況下不建議使用 foreach 循環:移除元素: 使用 foreach

在Java中,foreach 是一個常用的循環結構,它可以極大地簡化遍歷數組或集合(例如 List 或 Set)的代碼。它通常被認為是一種更加簡潔和易讀的迭代方式。然而,可能有一些情況下不建議使用 foreach 循環:Cbj28資訊網——每日最新資訊28at.com

Cbj28資訊網——每日最新資訊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 循環使用的是開始迭代時的集合狀態,所以迭代過程中集合狀態的改變不會影響到迭代本身。這可能導致大量內存的額外消耗,尤其是當集合很大時。Cbj28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-43330-0.htmlJava中不建議使用foreach的六大場景

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Matplotlib中的titles(標題)、labels(標簽)和legends(圖例)

下一篇: 測試左移與提測流水線的應用實踐

標簽:
  • 熱門焦點
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發布,近日該機的真機包裝盒在網上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續了之前的方案,變化不大,這也是目前小米旗艦
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力。  CRM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規模如今超過580
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 自動化在DevOps中的力量:簡化軟件開發和交付

    自動化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動化工具和方法,DevOps團隊可以實現以下目標:消除手動和重復性任務。簡化流程。在整個軟件開發生命周期中實現更
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 阿里瓴羊One推出背后,零售企業迎數字化新解

    作者:劉曠近年來隨著數字經濟的高速發展,各式各樣的SaaS應用服務更是層出不窮,但本質上SaaS大多局限于單一業務流層面,對用戶核心關切的增長問題等則沒有提供更好的解法。在Saa
  • 華為將推出盤古數字人大模型 可幫助用戶12小時完成數字人生成

    在今日舉行的2023年華為云數字文娛AI創新峰會上,華為云全球Marketing與銷售服務總裁石冀琳表示,華為云將在后續推出盤古數字人大模型,可幫助用戶12小
  • OPPO K11采用全方位護眼屏:三大護眼能力減輕視覺疲勞

    日前OPPO官方宣布,全新的OPPO K11將于7月25日正式發布,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼IMX890主攝,堪稱是2000檔位影像表
Top 主站蜘蛛池模板: 偃师市| 崇义县| 福清市| 隆尧县| 沁源县| 郴州市| 红安县| 宿迁市| 乾安县| 乐山市| 获嘉县| 七台河市| 阿拉尔市| 寿宁县| 仁寿县| 延川县| 容城县| 海丰县| 突泉县| 永嘉县| 上犹县| 嵊州市| 凌海市| 广水市| 信丰县| 盱眙县| 永新县| 浑源县| 昆山市| 松阳县| 措美县| 东光县| 台南县| 德昌县| 白玉县| 迁西县| 堆龙德庆县| 仁布县| 吉木萨尔县| 岫岩| 五峰|