JAVA基礎:Collections 工具類實戰指南-從排序到線程安全

在 Java 開發中,集合類幾乎貫穿每一個項目,而Collections工具類提供了一系列強大的方法,用于操作和增強集合的功能。無論是排序、查找還是線程安全的封裝,Collections工具類都是提升代碼效率和質量的重要工具。

一、Collections 工具類概述

java.util.Collections是 Java 提供的一個工具類,主要用于操作集合類(如 List、Set 和 Map)。其核心方法包括:

1.排序操作:如sort()和reverseOrder()。

2.查找與填充:如binarySearch()和fill()。

3.其他操作:如shuffle()、swap()等。

4.線程安全包裝:如synchronizedList()和synchronizedMap()。

5.不可變集合:如unmodifiableList()。

二、排序操作:讓數據更有序

Collections.sort()是最常用的方法之一,可對 List 進行自然排序或自定義排序。

示例 1:自然排序

import java.util.*;public class CollectionsSortExample {public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("banana", "apple", "cherry"));// 自然排序Collections.sort(list);System.out.println("自然排序后: " + list);  // 輸出: [apple, banana, cherry]}
}

示例 2:自定義排序

Collections.sort(list, Comparator.reverseOrder());
System.out.println("降序排序后: " + list);  // 輸出: [cherry, banana, apple]

實戰場景:商品價格排序

假設有一個商品列表,需要按價格從低到高排序:

List<Product> products = Arrays.asList(new Product("Apple", 100),new Product("Banana", 60),new Product("Cherry", 120)
);Collections.sort(products, Comparator.comparingInt(Product::getPrice));
System.out.println("按價格排序后的商品: " + products);

三、查找與填充

1. Collections.binarySearch()

binarySearch()用于在排序后的列表中快速查找元素的位置。

import java.util.*;public class CollectionsBinarySearchExample {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 3, 5, 7, 9);// 必須先排序Collections.sort(list);int index = Collections.binarySearch(list, 5);System.out.println("元素 5 的索引位置: " + index);  // 輸出: 2}
}

注意:

binarySearch()的前提是列表必須是有序的,否則結果不可預測。

2. Collections.fill()

fill()可將集合中的所有元素替換為指定值。

import java.util.*;
public class CollectionsFillExample {public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));Collections.fill(list, "X");System.out.println("填充后的集合: " + list);  // 輸出: [X, X, X]}
}

四、其他操作

1. Collections.shuffle()

shuffle()用于將集合中的元素隨機排列,適合打亂順序的場景,如洗牌程序或抽獎工具。

Collections.shuffle(list);
System.out.println("打亂順序后的集合: " + list);

實戰場景:洗牌功能實現

List<String> deck = new ArrayList<>(Arrays.asList("?A", "?2", "?3", "?A", "?2", "?3"
));
Collections.shuffle(deck);
System.out.println("洗牌后的結果: " + deck);

2. Collections.swap()

swap()方法可交換集合中兩個元素的位置。

import java.util.*;public class SwapExample {public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));Collections.swap(list, 0, 2);System.out.println("交換后的列表: " + list);  // 輸出: [C, B, A]}
}

實戰場景:數組中最小值和最大值交換

List<Integer> list = Arrays.asList(3, 5, 1, 9, 7);
int minIndex = list.indexOf(Collections.min(list));
int maxIndex = list.indexOf(Collections.max(list));
Collections.swap(list, minIndex, maxIndex);
System.out.println("交換后: " + list);  // 示例輸出: [9, 5, 1, 3, 7]

五、線程安全包裝

在多線程環境中,原生集合類如ArrayList并不是線程安全的,可以通過Collections.synchronizedXXX()方法生成線程安全的集合。

示例 1:線程安全的集合包裝

import java.util.*;public class SynchronizedCollectionsExample {public static void main(String[] args) {List<String> list = new ArrayList<>();// 轉換為線程安全的 ListList<String> synchronizedList = Collections.synchronizedList(list);synchronizedList.add("Thread-safe");System.out.println("線程安全的集合: " + synchronizedList);}
}

實戰場景:多線程統計數據

List<Integer> scores = Collections.synchronizedList(new ArrayList<>());Runnable task = () -> {for (int i = 0; i < 1000; i++) {scores.add(i);}
};Thread t1 = new Thread(task);
Thread t2 = new Thread(task);t1.start();
t2.start();try {t1.join();t2.join();
} catch (InterruptedException e) {e.printStackTrace();
}System.out.println("線程安全的集合大小: " + scores.size());

六、不可變集合:安全共享數據

不可變集合是指在創建后無法修改的集合類型,適合在多線程環境下共享數據。

示例 1: 創建不可變集合

 unmodifiableList
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
List<String> unmodifiableList = Collections.unmodifiableList(list);// 嘗試修改會拋出 UnsupportedOperationException
try {unmodifiableList.add("D");
} catch (UnsupportedOperationException e) {System.out.println("Cannot modify immutable list!");
}

實戰場景:配置文件的共享

Map<String, String> config = new HashMap<>();
config.put("host", "localhost");
config.put("port", "8080");Map<String, String> unmodifiableConfig = Collections.unmodifiableMap(config);// 多個線程可以安全地讀取配置
Runnable task = () -> {System.out.println("Host: " + unmodifiableConfig.get("host"));
};Thread t1 = new Thread(task);
Thread t2 = new Thread(task);t1.start();
t2.start();

七、性能優化建議

1.避免頻繁排序

對于動態數據的排序,建議使用TreeSet或PriorityQueue。

2.選擇合適的線程安全集合

在頻繁讀寫場景中,優先考慮ConcurrentHash-Map或CopyOnWriteArrayList。

3.減少鎖競爭

使用synchronizedList時,盡量避免在循環中頻繁調用修改操作。

八、綜合實戰:線程安全排行榜

以下案例展示如何結合Collections工具類創建線程安全的排行榜:

import java.util.*;public class LeaderboardExample {public static void main(String[] args) {// 創建線程安全的排行榜(List)List<Integer> scores = Collections.synchronizedList(new ArrayList<>());// 添加分數scores.addAll(Arrays.asList(85, 90, 75, 95, 88));// 排序Collections.sort(scores, Collections.reverseOrder());System.out.println("排行榜: " + scores);  // 輸出: [95, 90, 88, 85, 75]// 查找某個分數的排名int rank = Collections.binarySearch(scores, 90, Collections.reverseOrder());System.out.println("分數 90 的排名: 第 " + (rank + 1) + " 名");}
}

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

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

相關文章

ReLU函數及其Python實現

ReLU函數及其Python實現 文章目錄 ReLU函數及其Python實現1. ReLU函數定義2. Python實現3. 在深度學習中的應用總結 1. ReLU函數定義 ReLU&#xff08;Rectified Linear Unit&#xff0c;修正線性單元&#xff09;函數是深度學習中常用的激活函數之一。它的定義非常簡單&#…

2505ahk,wmi學習

檢索每個服務的狀態和啟動類型 wbemServices : ComObjGet("winmgmts:\\.") //.代表本地計算機. wbemObjectSet : wbemServices.InstancesOf("Win32_Service")For wbemObject In wbemObjectSetMsgBox, % "Display Name: " wbemObject.DisplayNam…

大語言模型能力評定探討

有標準答案的評估&#xff08;選擇題&#xff09; 評估語言模型能力的基本思路是準備輸入和標準答案&#xff0c;比較不同模型對相同輸入的輸出 由于AI答題有各種各樣答案&#xff0c;因此現在是利用選擇題考察。 有一個知名的選擇題的基準叫做Massive Multitask Language Und…

數字智慧方案5874丨智慧交通收費稽核管理體系的構建與思考(44頁PPT)(文末有下載方式)

資料解讀&#xff1a;智慧交通收費稽核管理體系的構建與思考 詳細資料請看本解讀文章的最后內容。 隨著高速公路收費系統的不斷升級&#xff0c;特別是撤站后的新形勢&#xff0c;收費稽核管理體系的構建顯得尤為重要。本文將對遼寧省在聯網收費新形勢下的收費稽核管理體系進…

3.Java轉義字符

Java轉義字符 轉義字符以\開頭&#xff0c;常見的轉義字符&#xff1a; 轉義字符作用\t &#x1f31f;水平制表符&#xff08;Tab&#xff09;\r &#x1f31f;“回車&#xff08;Carriage Return&#xff09;”\n換行&#xff08;New Line&#xff09;\\輸出一個反斜杠 \\&q…

【湊修電腦的小記錄】vscode打不開

想把vscode的數據和環境從c盤移到d盤 大概操作和這篇里差不多 修改『Visual Studio Code&#xff08;VS Code&#xff09;』插件默認安裝路徑的方法 - 且行且思 - 博客園 在原地址保留了個指向新地址的鏈接文件。 重新安裝vscode后雙擊 管理員身份運行均無法打開&#xff0…

MSP430G2553驅動0.96英寸OLED(硬件iic)

1.前言 最近需要用MSP430單片機做一個大作業,需要用到OLED模塊&#xff0c;在這里記錄一下 本篇文章主要講解MSP430硬件iic的配置和OLED函數的調用&#xff0c;不會詳細講解OLED顯示原理(其實就是江科大的OLED模塊如何移植到msp430上).OLED顯示原理以及底層函數講解請參考其他…

SEO長尾詞精準優化實戰

內容概要 在搜索引擎優化領域&#xff0c;長尾關鍵詞的精準挖掘與優化已成為突破流量瓶頸的核心策略。相較于通用詞匯&#xff0c;長尾詞具備更強的用戶意圖指向性與競爭分散特征&#xff0c;能夠有效觸達細分需求場景下的高價值受眾。本部分將從長尾詞的核心價值出發&#xf…

計算機組成原理實驗(6) 微程序控制單元實驗

實驗六 微程序控制單元實驗 一、實驗目的 1、熟悉微程序控制器的原理 2、掌握微程序編制、寫入并觀察運行狀態 二、實驗要求 按照實驗步驟完成實驗項目&#xff0c;掌握設置微地址、微指令輸出的方法 三、實驗說明 3.1 微程序控制單元的構成&#xff1a;&#xff08;…

ECMAScript 2(ES2):標準化的微調與鞏固

1. 版本背景與發布 發布時間&#xff1a;1998 年 6 月&#xff0c;由 ECMA International 正式發布&#xff0c;標準編號為 ECMA-262 Edition 2。核心定位&#xff1a;作為 ECMAScript 標準的第二次修訂版&#xff0c;ES2 的核心目標是修正 ES1 中的錯誤、完善規范定義&#x…

基于蒙特卡洛模擬的電路容差分析與設計優化

蒙特卡洛模擬在電路設計中的應用 背景知識&#xff1a; 蒙特卡洛模擬是一種通過隨機抽樣來解決問題的數值方法。在電路設計中&#xff0c;它通過在元件參數的公差范圍內隨機生成大量樣本值&#xff0c;模擬電路在不同參數組合下的行為&#xff0c;從而評估和優化電路設計&…

node.js 實戰——mongoDB

MongoDB MongoDB 簡介 MongoDB 是一種基于文檔型 (document-oriented) 的 NoSQL 數據庫&#xff0c;使用類 JSON 的 BSON 格式存儲數據&#xff0c;自然支持復雜數據結構。它特別適合需要快速變化、大量數據處理和高應用擴展性的場景。 MongoDB 特性&#xff1a; 無法表、無…

如何掌握 Lustre/Scade 同步數據流語言

從 KPN 的萌芽開始&#xff0c;到 Lustre/Scade 的發展&#xff0c;再到 Velus/Zelus/Swan 在形式化編譯、連續時間建模、MBD 平權等各方面的邊界拓展&#xff0c;同步數據流語言已經歷許多。現在&#xff0c;我們討論如何掌握 Lustre/Scade 這類法式技術&#xff0c;從語言基礎…

神州趣味地名-基于天地圖和LeafLet的趣味地名探索

目錄 前言 一、搜索API據介紹 1、官方API 2、Leaflet集成 二、成果介紹 1、令人忍俊不禁的地名 2、黑地名 3、數字地名 4、文藝地名 三、總結 前言 在華夏大地廣袤的土地上&#xff0c;地名承載著深厚的歷史文化底蘊&#xff0c;它們如同一顆顆璀璨的明珠&#xff0c;…

第6篇:EggJS數據庫操作與ORM實踐

在Web應用開發中&#xff0c;數據庫操作是核心環節之一。EggJS通過集成Sequelize ORM框架&#xff0c;提供了高效、安全的數據庫操作方案。本文將深入講解如何在EggJS中配置MySQL數據庫、定義數據模型、優化復雜查詢&#xff0c;以及管理數據庫遷移與種子數據。 一、MySQL基礎配…

法線紋理采樣+可視化Shader編輯器

法線貼圖&#xff0c;對主紋理凹凸顯示 建模原理 法線貼圖&#xff1a;切線空間&#xff0c;存儲xy切線&#xff0c;映射法線&#xff0c;法線信息存儲在切線空間中。 模型是否凹凸&#xff0c;是由模型頂點決定的&#xff0c;現在實現的法線貼圖&#xff0c;控制凹凸,實際上是…

OID是什么?

什么是 OID? OID 是 Object Identifier(對象標識符) 的縮寫,是SNMP(Simple Network Management Protocol,簡單網絡管理協議)中用來唯一標識被管理對象(比如設備的某項信息)的一串數字。

STM32 ZIBEE DL-20 無線串口模塊

一.配置方法 二.串口中斷 u8 i; u16 buf[20],res; u8 receiving_flag 0; // 新增一個標志&#xff0c;用于標記是否開始接收數組 void USART1_IRQHandler(void) {if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) //接收中斷{res USART_ReceiveData(USART1);if(receiv…

全感官交互革命:當 AI 大模型學會 “看、聽、說、創”

引言&#xff1a;從 “文字對話” 到 “全感官體驗”&#xff0c;AI 正在重塑人類認知邊界 當 AI 不再局限于文本對話&#xff0c;而是能 “看懂” 圖像、“聽懂” 語音、“生成” 視頻&#xff0c;并將這些模態無縫融合時&#xff0c;一場關于人機交互的革命已然開啟。DeepSe…

C++模板知識

目錄 引言 一、非類型模板參數 二、類模板的特化 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;函數模板特化 &#xff08;三&#xff09;類模板特化 1. 全特化 2. 偏特化 &#xff08;四&#xff09;類模板特化應用示例 三、模板的分離編譯 …