java加強 -Collection集合

集合是一種容器,類似于數組,但集合的大小可變,開發中也非常常用。Collection代表單列集合,每個元素(數據)只包含1個值。Collection集合分為兩類,List集合與set集合。

特點

List系列集合:添加的元素有序,可重復,有指引。

即ArrayList、LinkedList:有序、可重復、有索引。

Set系列集合:添加的元素是無序、不重復、無索引。

HashSet:無序、不重復、無索引;

LinkedHashSet 有序、不重復、無索引。

TreeSet:按大小默認升序排序、不重復、無索引。

(Collection,List與Set是接口,ArrayList等集合是它們的實現類)

示例:

package Collection;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class CollectionDemo1 {public static void main(String[] args) {//目標:搞清楚Collection集合的整體特點//1、list家族的集合:有序,可重復,有索引List<String> list = new ArrayList<>();list.add("java");list.add("java");list.add("c++");list.add("python");System.out.println(list);for(int i = 0; i < list.size(); i++)System.out.println(list.get(i));//2、set家族的集合:無序,不可重復,無索引Set<String> set = new HashSet<>();set.add("java");set.add("java");set.add("c++");set.add("python");System.out.println(set);//無索引,沒有get方法}
}

Collection集合的通用方法

package Collection;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;public class CollectionDemo2 {public static void main(String[] args) {//目標:搞清楚Collection集合的通用功能Collection<String> list = new ArrayList<>();//添加集合元素list.add("java");list.add("c++");list.add("python");System.out.println(list);//判斷集合元素個數System.out.println(list.size());//刪除集合元素list.remove("c++");System.out.println(list);//判斷集合是否為空System.out.println(list.isEmpty());//清空集合list.clear();System.out.println(list.isEmpty());System.out.println(list);list.add("java");list.add("c++");//判斷集合中是否包含某個元素System.out.println(list.contains("java"));System.out.println(list.contains("c++"));System.out.println(list.contains("python"));//集合轉數組
//        Object[] arr = list.toArray();
//        for (int i = 0; i < arr.length; i++) {
//            System.out.println(arr[i]);
//        }String[] arr = list.toArray(String[]::new);System.out.println(Arrays.toString(arr));}
}

集合的幾種遍歷方式

通常,我們有三種方法可以遍歷集合

一、迭代器遍歷

package Collection;import java.util.ArrayList;
import java.util.Iterator;public class CollectionDemo3 {public static void main(String[] args) {//目標:理解集合的遍歷方式//方式一:迭代器遍歷ArrayList<String> names = new ArrayList<>();names.add("林青霞");names.add("張曼玉");names.add("王祖藍");names.add("柳巖");names.add("張無忌");System.out.println(names);//1、得到一個迭代器對象Iterator<String> it = names.iterator();//it的位置是集合的第一個位置//System.out.println(it.next());      //取出當前位置數據,并且移動到下一個位置//while循環遍歷while(it.hasNext()){    //判斷當前位置有沒有數據String name = it.next();System.out.println(name);}}
}

如上述代碼,通過java庫中Iterator<數據類型>變量名 來獲取一個迭代器對象,用變量名.hasNext()來判斷當前位置是否有值,沒有值則不進入循環。再通過變量名.next獲得當前位置數據,并將指針移向下一位數字來進行數據的輸出。

二、增強for循環遍歷

package Collection;import java.util.ArrayList;public class CollectionDemo4 {public static void main(String[] args) {//方式二:增強for循環遍歷ArrayList<String> names = new ArrayList<>();names.add("林青霞");names.add("張曼玉");names.add("王");names.add("柳巖");names.add("張無忌");System.out.println(names);//可以遍歷集合,也能遍歷數組for(String name : names){System.out.println(name);}}
}

這是一個通用的方法,可以用于集合也可以用于數組,用name接收集合中的值并一個個將其打出。

三:Lambda方法:forEach遍歷

package Collection;import java.util.ArrayList;
import java.util.function.Consumer;public class CollectionDemo5 {public static void main(String[] args) {//方式三:LambdaArrayList<String> names = new ArrayList<>();names.add("林青霞");names.add("張曼玉");names.add("王");names.add("柳巖");names.add("張無忌");//forEach(Consumer<? super T> action)//這是一個接口,所以需要使用Lambda表達式
//        names.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });names.forEach(s -> System.out.println(s));}
}

通過重寫集合中的accept方法進行遍歷。

并發修改異常問題與解決

在遍歷一個集合并對其中數據進行修改時,若是在循環中直接刪掉一個數容易產生并發修改異常問題。例如,一個集合中有李明,李四,張三,王五 。當我們需要刪除名字中帶李的人時,遍歷到李明時指針為0,李明被刪除,數組上移一位,李四變為指針0,可此時指針已經移動到1的位置,李四被略過沒刪除,這就是并發修改異常問題。

示例

package Collection;import java.util.ArrayList;
import java.util.Iterator;public class CollectionDemo6 {public static void main(String[] args) {//目標:認識并發修改異常問題,搞清楚每種遍歷的區別ArrayList<String> list = new ArrayList<>();list.add("Java入門");list.add("黑枸杞");list.add("寧夏枸杞");list.add("枸杞");list.add("特級枸杞");list.add("枸杞子");list.add("西洋參");System.out.println(list);//[Java入門, 黑枸杞, 寧夏枸杞, 枸杞, 特級枸杞, 枸杞子, 西洋參]for (int i = 0; i < list.size(); i++) {String s = list.get(i);if (s.contains("枸杞")){list.remove(s);}}System.out.println(list);   //枸杞沒有刪完//[Java入門, 寧夏枸杞, 特級枸杞, 西洋參]//原因是當遍歷到了黑枸杞并刪除時,此時索引變成了2,但因為黑枸杞被刪了,寧夏枸杞的索引變成了1,所以索引為1的元素被跳過了System.out.println("========================================================");ArrayList<String> list2 = new ArrayList<>();list2.add("Java入門");list2.add("黑枸杞");list2.add("寧夏枸杞");list2.add("枸杞");list2.add("特級枸杞");list2.add("枸杞子");list2.add("西洋參");System.out.println(list2);//解決方案1:刪除時索引-1
//        for (int i = 0; i < list2.size(); i++)
//            {
//                String s = list2.get(i);
//                if (s.contains("枸杞"))
//                {
//                    list2.remove(i);
//                    i--;//刪除后索引要減一
//                }
//            }//方案二:倒著遍歷 (支持索引)for (int i = list2.size()-1; i >=0 ; i--) {String s = list2.get(i);if (s.contains("枸杞"))list2.remove(s);}System.out.println(list2);System.out.println("========================================================");//三種遍歷的區別ArrayList<String> list3 = new ArrayList<>();list3.add("Java入門");list3.add("黑枸杞");list3.add("寧夏枸杞");list3.add("枸杞");list3.add("特級枸杞");list3.add("枸杞子");list3.add("西洋參");System.out.println(list3);//一、迭代器遍歷刪除默認也存在并發修改異常問題Iterator<String> it = list3.iterator();while (it.hasNext()){String s = it.next();if (s.contains("枸杞"))//it.remove(s);it.remove();//用迭代器自己的方法刪}System.out.println(list3);System.out.println("========================================================");ArrayList<String> list4 = new ArrayList<>();list4.add("Java入門");list4.add("黑枸杞");list4.add("寧夏枸杞");list4.add("枸杞");list4.add("特級枸杞");list4.add("枸杞子");list4.add("西洋參");System.out.println(list4);//二、三:增強for和Lambda(無法解決并發修改異常)
//        for (String s : list4) {
//            if (s.contains("枸杞"))
//                list4.remove(s);
//        }//結論:增強for和Lambda只適合做遍歷,不適合遍歷并修改
//        System.out.println(list4);list4.removeIf(s -> s.contains("枸杞"));System.out.println(list4);}
}

迭代器遍歷內有專門解決這個問題的方法,即迭代器.remove(),刪掉當前迭代器指向的值并且指針不動。用正常for循環時,可以用每刪一個值指針就向前一位解決。還有一種方法就是從后往前遍歷,刪除后面的數據對前面的數據不造成影響,也可以正常刪除。而增強for和Lambda則沒有方法解決這個并發修改異常問題。因此,得出結論,增強for與Lambda適合用于遍歷,而遍歷同時進行修改則需要使用別的遍歷方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905703.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解ThingsBoard的Actor模型

1、ThingsBoard系統中定義了哪些Actor ? ThingsBoard Actor 創建機制與作用對照表: Actor 類型 何時創建 由誰創建 是否緩存 作用描述 SystemActor 系統啟動時 DefaultActorService / ActorSystem ? 是 ★ ThingsBoard 平臺服務級別管理器:負責創建所有的Actor AppActor

WPS一旦打開,就會修改默認打開方式,怎么解?

目錄 前言 解決方法 結語 前言 電腦上同時存在WPS和微軟的Office全家桶&#xff0c;但是我更喜歡用Office全家桶。前幾天剛在設置改過來&#xff0c;忘記更改pdf文件打開默認應用。結果沒過幾天&#xff0c;不小心用WPS打開pdf文件時候&#xff0c;給我把默認設置全改回去了…

深度學習中--模型調試與可視化

第一部分&#xff1a;損失函數與準確率的監控&#xff08;Loss / Accuracy Curve&#xff09; 1. 為什么要監控 Loss 與 Accuracy&#xff1f; Loss 是模型優化的依據&#xff0c;但它可能下降了 Accuracy 反而沒變&#xff08;過擬合信號&#xff09; Accuracy 才是評估效果的…

中間件-RocketMQ

RocketMQ 基本架構消息模型消費者消費消息模式順序消息機制延遲消息批量消息事務消息消息重試最佳實踐 基本架構 nameServer: 維護broker列表信息&#xff0c;客戶端連接時只需要連接nameServer。可配置成集群。 broker&#xff1a;broker分為master和slave&#xff0c;master負…

anaconda3如何切換虛擬環境

在 Anaconda3 中切換虛擬環境可以通過 命令行 或 Anaconda Navigator 圖形界面實現。以下是詳細步驟&#xff1a; 方法1&#xff1a;通過命令行切換&#xff08;推薦&#xff09; 1. 查看所有虛擬環境 conda env list # 或 conda info --envs 輸出示例&#xff1a; base …

【vue】axios網絡請求介紹

一、基礎使用 1.引入js文件 2.在methods中的函數里寫 axios.get(路徑) .then((res))>{ console.log(res.data)&#xff1b;//控制臺打印結果數據 this.listArrres.data//定義數組來接收返回來的數據 }&#xff09; 二、參數傳遞 參數傳遞一般在路徑后面使用 params:{ num:2,…

機器學習 --- KNN算法

機器學習 — KNN算法 文章目錄 機器學習 --- KNN算法一&#xff0c;sklearn機器學習概述二&#xff0c;KNN算法---分類2.1樣本距離判斷2.2 KNN算法原理2.3 KNN缺點2.4 API2.5 使用sklearn中鳶尾花數據集實現KNN 一&#xff0c;sklearn機器學習概述 獲取數據、數據處理、特征工…

Spring Boot 中的重試機制

Retryable 注解簡介 Retryable 注解是 Spring Retry 模塊提供的&#xff0c;用于自動重試可能會失敗的方法。在微服務架構和分布式系統中&#xff0c;服務之間的調用可能會因為網絡問題、服務繁忙等原因失敗。使用 Retryable 可以提高應用的穩定性和容錯能力 1。 使用步驟 &…

FPGA生成隨機數的方法

FPGA生成隨機數的方法&#xff0c;目前有以下幾種: 1、震蕩采樣法 實現方式一&#xff1a;通過低頻時鐘作為D觸發器的時鐘輸入端&#xff0c;高頻時鐘作為D觸發器的數據輸入端&#xff0c;使用高頻采樣低頻&#xff0c;利用亞穩態輸出隨機數。 實現方式二&#xff1a;使用三個…

(五)毛子整潔架構(分布式日志/Redis緩存/OutBox Pattern)

文章目錄 項目地址一、結構化日志1.1 使用Serilog1. 安裝所需要的包2. 注冊服務和配置3. 安裝Seq服務 1.2 添加分布式id中間件1. 添加中間件2. 注冊服務3. 修改Application的LoggingBehavior 二、Redis緩存2.1 添加緩存1. 創建接口ICaching接口2. 實現ICaching接口3. 注冊Cachi…

Vue.js 全局導航守衛:深度解析與應用

在 Vue.js 開發中&#xff0c;導航守衛是一項極為重要的功能&#xff0c;它為開發者提供了對路由導航過程進行控制的能力。其中&#xff0c;全局導航守衛更是在整個應用的路由切換過程中發揮著關鍵作用。本文將深入探討全局導航守衛的分類、作用以及參數等方面內容。 一、全局…

使用FastAPI和React以及MongoDB構建全棧Web應用05 FastAPI快速入門

一、FastAPI概述 1.1 什么是FastAPI FastAPI is a modern, high-performance Python web framework designed for building APIs. It’s rapidly gaining popularity due to its ease of use, speed, and powerful features. Built on top of Starlette, FastAPI leverages a…

如何查看打開的 git bash 窗口是否是管理員權限打開

在 git bash 中輸入&#xff1a; net session >nul 2>&1 && (echo Ok) || (echo Failed) 顯示 OK 》是管理員權限&#xff1b; 顯示 Failed 》不是管理員權限。 如何刪除此步生成的垃圾文件&#xff1a; 新建一個 .txt 文件&#xff0c;輸入以下代碼…

得物0509面試手撕題目解答

題目 使用兩個棧&#xff08;一個無序棧和一個空棧&#xff09;將無序棧中的元素轉移到空棧&#xff0c;使其有序&#xff0c;不允許使用其他數據結構。 示例&#xff1a;輸入&#xff1a;[3, 1, 6, 4, 2, 5]&#xff0c;輸出&#xff1a;[6, 5, 4, 3, 2, 1] 思路與代碼 如…

基于 Nexus 在 Dockerfile 配置 yum, conda, pip 倉庫的方法和參考

在 Nexus 配置代理倉庫的方法&#xff0c;可參考 pypi 的配置博客&#xff1a;https://hellogitlab.com/CI/docker/create_your_nexus_2 更多代理格式&#xff0c;參考官方文檔&#xff0c;如 pypi&#xff1a;https://help.sonatype.com/en/pypi-repositories.html 配置 yum…

[6-8] 編碼器接口測速 江協科技學習筆記(7個知識點)

1 2 在STM32微控制器的定時器模塊中&#xff0c;CNT通常指的是定時器的計數器值。以下是CNT是什么以及它的用途&#xff1a; 是什么&#xff1a; ? CNT&#xff1a;代表定時器的當前計數值。在STM32中&#xff0c;定時器從0開始計數&#xff0c;直到達到預設的自動重裝載值&am…

RabbitMQ ③-Spring使用RabbitMQ

Spring使用RabbitMQ 創建 Spring 項目后&#xff0c;引入依賴&#xff1a; <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifac…

海外IP被誤封解決方案

這里使用Google Cloud和Cloudflare來實現&#xff0c;解決海外服務器被誤封IP&#xff0c;訪問不到的問題。 這段腳本的核心目的&#xff0c;是自動監測你在 Cloudflare 上管理的 VPS 域名是否可達&#xff0c;一旦發現域名無法 Ping 通&#xff0c;就會幫你更換IP&#xff1a…

一個基于 Spring Boot 的實現,用于代理百度 AI 的 OCR 接口

一個基于 Spring Boot 的實現&#xff0c;用于代理百度 AI 的 OCR 接口 BaiduAIController.javaBaiduAIConfig.java在 application.yml 或 application.properties 中添加配置&#xff1a;application.yml同時&#xff0c;需要在Spring Boot應用中配置RestTemplate&#xff1a;…

GPT-4o 遇強敵?英偉達 Eagle 2.5 視覺 AI 王者登場

前言&#xff1a; 在人工智能領域&#xff0c;視覺語言模型的競爭愈發激烈。GPT-4o 一直是該領域的佼佼者&#xff0c;但英偉達的 Eagle 2.5 橫空出世&#xff0c;憑借其 80 億參數的精簡架構&#xff0c;在長上下文多模態任務中表現出色&#xff0c;尤其是在視頻和高分辨率圖像…