java 集合 之 集合工具類Collections

前言

? ? ? ? 早期開發者經常需要對集合進行各種操作

? ? ? ? 比如排序、查找最大最小值等等

? ? ? ? 但是當時沒有統一的工具類來處理

? ? ? ? 所以導致代碼重復且容易出錯

????????

? ? ? ? java.util.Collections 工具類的引入

? ? ? ? 為開發者提供了大量?靜態方法?操作集合

? ? ? ? 它就像一個經驗豐富的助手

? ? ? ? 和數組工具類 Arrays 一樣

? ? ? ? 避免了我們重復造輪子的情況

一、Collections 工具類概述

java.util.Collections 是一個操作集合的工具類

提供大量 靜態方法 操作 返回 集合

源碼:

// Collections 類的聲明
public class Collections {// 私有構造函數,防止實例化private Collections() {}// ... 大量靜態方法
}

通過源碼我們可以看出:

  • Collections 是一個很純粹的工具類
  • 沒有繼承,沒有實現,父類是 Object
  • 構造器私有,不能實例化對象?

注意區分:

? ? ? ? Collections 是集合的工具類

? ? ? ? Collection? ?是單列集合的根接口

二、核心方法

1、addAll

方法聲明:

????????public static <T> boolean addAll(Collection<? super T> c, T... elements)

調用者:

????????Collections

參數:

????????Collection<? super T>c :目標集合

? ? ? ? T...elements :要添加的元素(可變參)

? ? ? ?

泛型中,我們常見三種形式:

1、T? ? ? ? ? ? ? ? ? ? ? ? 具體類型參數

2、?extends T? ? ? 上界通配符,表示T或T的子類型

3、?super T? ? ? ? ? 下界通配符,表示T或T的父類型

????????????????????????

返回值:

????????boolean,如果集合被修改則返回true

作用:

????????將多個元素一次性添加到集合中

是否改變原始值:

????????是,會修改目標集合

源碼:

public static <T> boolean addAll(Collection<? super T> c, T... elements) {boolean result = false;for (T element : elements)result |= c.add(element);return result;
}

源碼解讀:

  • 使用可變參 T...elements 接收任意數量的元素
  • 遍歷所有元素,逐個添加到集合中
  • 使用 位或運算 |= 累計添加結果,只要有元素成功添加就返回true

示例:

import java.util.*;public class AddAllExample {public static void main(String[] args) {List<String> fruits = new ArrayList<>();// 使用 Collections.addAll 批量添加元素Collections.addAll(fruits, "apple", "banana", "orange", "grape");System.out.println("水果列表: " + fruits);// 輸出: 水果列表: [apple, banana, orange, grape]// 對比傳統方式List<String> vegetables = new ArrayList<>();vegetables.add("carrot");vegetables.add("potato");vegetables.add("tomato");System.out.println("蔬菜列表: " + vegetables);// 輸出: 蔬菜列表: [carrot, potato, tomato]}
}

2、sort

方法聲明:

? ? ? ? //自然排序版本

????????public static <T extends Comparable<? super T>> void sort(List<T> list)

? ? ? ? //比較器排序版本

????????public static <T> void sort(List<T> list, Comparator<? super T> c)

調用者:

? ? ? ? Collections

參數:

? ? ? ? List<T> list:要排序的列表

? ? ? ? Comparator<?super T>c:比較器(可選)

返回值:

? ? ? ? void

作用:

? ? ? ? 對列表進行排序

是否改變原始值:

? ? ? ? 是,會修改原列表

注意事項:

? ? ? ? 自然排序要求實現 Comparable 接口

源碼:

// 自然排序版本
public static <T extends Comparable<? super T>> void sort(List<T> list) {list.sort(null);
}// 比較器排序版本
public static <T> void sort(List<T> list, Comparator<? super T> c) {list.sort(c);
}

源碼解讀:

實際上是委托給 List 接口的 sort 方法實現

JDK 8 之后,List 接口增加了默認方法 sort,Collections.sort 成為了該方法的包裝

JDK 8 之前 Collections.sort() 實現:

// JDK 8 之前的 Collections.sort() 實現(簡化版)
public static <T extends Comparable<? super T>> void sort(List<T> list) {Object[] a = list.toArray();Arrays.sort(a);ListIterator<T> i = list.listIterator();for (int j=0; j<a.length; j++) {i.next();i.set((T)a[j]);}
}

JDK 8 之后 List 接口新增的默認方法:

// List 接口中的默認方法 sort()
default void sort(Comparator<? super E> c) {Object[] a = this.toArray();Arrays.sort(a, (Comparator) c);ListIterator<E> i = this.listIterator();for (int j=0; j<a.length; j++) {i.next();i.set((E) a[j]);}
}

JDK 8 之后 Collections.sort() 實現:

// JDK 8 之后 Collections.sort() 的實現(簡化版)
public static <T extends Comparable<? super T>> void sort(List<T> list) {list.sort(null); // 委托給 List.sort() 方法
}public static <T> void sort(List<T> list, Comparator<? super T> c) {list.sort(c); // 委托給 List.sort() 方法
}

總結一下:

  1. 功能轉移:排序核心功能被轉移到了 List 接口中
  2. 實現委托:Collections.sort() 方法現在內部調用 List.sort() 來實現排序功能

示例:

import java.util.*;public class SortExample {public static void main(String[] args) {// 自然排序示例List<Integer> numbers = new ArrayList<>();Collections.addAll(numbers, 5, 2, 8, 1, 9);System.out.println("排序前: " + numbers);Collections.sort(numbers); // 自然排序System.out.println("自然排序后: " + numbers);// 輸出: 自然排序后: [1, 2, 5, 8, 9]// 比較器排序示例(降序)List<String> words = new ArrayList<>();Collections.addAll(words, "banana", "apple", "cherry");System.out.println("排序前: " + words);Collections.sort(words, Collections.reverseOrder()); // 降序排序System.out.println("降序排序后: " + words);// 輸出: 降序排序后: [cherry, banana, apple]}
}

3、reverse

方法聲明:

????????public static void reverse(List<?> list)

調用者:

? ? ? ? Collections

參數:

? ? ? ? List<?> list :要反轉的列表?

返回值:

? ? ? ? void

作用:

? ? ? ? 反轉集合中的元素順序

是否改變原始值:

? ? ? ? 是,會修改原集合

注意事項:

? ? ? ? 只適用于 List 類型的集合

源碼:

public static void reverse(List<?> list) {int size = list.size();if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {// 對于小列表或隨機訪問列表,直接交換元素for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)swap(list, i, j);} else {// 對于大列表且非隨機訪問,使用ListIteratorListIterator fwd = list.listIterator();ListIterator rev = list.listIterator(size);for (int i=0, mid=list.size()>>1; i<mid; i++) {Object tmp = fwd.next();fwd.set(rev.previous());rev.set(tmp);}}
}

源碼解讀:

  • 根據列表大小和是否實現 RandomAccess 接口選擇不同的實現策略
  • 小列表或者隨機訪問列表采用直接索引交換的方式
  • 大列表且非隨機訪問采用 LIstIterator

示例:

import java.util.*;public class ReverseExample {public static void main(String[] args) {List<String> colors = new ArrayList<>();Collections.addAll(colors, "red", "green", "blue", "yellow");System.out.println("反轉前: " + colors);// 輸出: 反轉前: [red, green, blue, yellow]Collections.reverse(colors);System.out.println("反轉后: " + colors);// 輸出: 反轉后: [yellow, blue, green, red]}
}

4、shuffle

方法聲明:

????????public static void shuffle(List<?> list)

????????public static void shuffle(List<?> list, Random rnd)

調用者:

? ? ? ? Collections

參數:

? ? ? ? List<?> list:要打亂的集合

? ? ? ? Random rnd:隨機數生成器(可選)? ?

返回值:

? ? ? ? void

作用:

? ? ? ? 隨機打亂列表中的元素順序

是否改變原始值:

? ? ? ? 是,會修改原集合

注意事項:

? ? ? ? 可以傳入自定義的Random對象以控制隨機種子

源碼:

public static void shuffle(List<?> list) {Random rnd = r;if (rnd == null)r = rnd = new Random();shuffle(list, rnd);
}public static void shuffle(List<?> list, Random rnd) {int size = list.size();if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {for (int i=size; i>1; i--)swap(list, i-1, rnd.nextInt(i));} else {Object arr[] = list.toArray();for (int i=size; i>1; i--)swap(arr, i-1, rnd.nextInt(i));ListIterator it = list.listIterator();for (int i=0; i<arr.length; i++) {it.next();it.set(arr[i]);}}
}

源碼解讀:

  • 使用 Fisher-Yates 洗牌算法實現隨機打亂
  • 根據列表大小和是否實現 RandomAccess 接口選擇不同的實現策略

示例:

import java.util.*;public class ShuffleExample {public static void main(String[] args) {List<Integer> cards = new ArrayList<>();for (int i = 1; i <= 10; i++) {cards.add(i);}System.out.println("洗牌前: " + cards);Collections.shuffle(cards);System.out.println("洗牌后: " + cards);// 使用固定種子的隨機數生成器Collections.shuffle(cards, new Random(123));System.out.println("固定種子洗牌: " + cards);}
}

5、max/min

方法聲明:

????????public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp)

????????public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)

調用者:

? ? ? ? Collections

參數:

? ? ? ? Collection<? extends T> coll:要查找的集合

? ? ? ? Comparator<? super T> comp:比較器(可選)

返回值:

? ? ? ? T,集合中的最大或最小元素

作用:

? ? ? ? 查找集合中的最大或最小元素

是否改變原始值:

? ? ? ? 否,不修改原集合

注意事項:

? ? ? ? 自然排序要求實現 Comparable 接口

? ? ? ? 空集合會拋出 NoSuchElementException

源碼:

public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) {Iterator<? extends T> i = coll.iterator();T candidate = i.next();while (i.hasNext()) {T next = i.next();if (next.compareTo(candidate) < 0)candidate = next;}return candidate;
}public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp) {if (comp==null)return (T)min((Collection) coll);Iterator<? extends T> i = coll.iterator();T candidate = i.next();while (i.hasNext()) {T next = i.next();if (comp.compare(next, candidate) < 0)candidate = next;}return candidate;
}

源碼解讀:

  • 通過迭代器遍歷集合,比較元素大小
  • 自然排序使用 compareTo 方法,比較器排序使用 compare 方法

示例:

import java.util.*;public class MaxMinExample {public static void main(String[] args) {List<Integer> numbers = new ArrayList<>();Collections.addAll(numbers, 10, 5, 8, 3, 15, 7);Integer max = Collections.max(numbers);Integer min = Collections.min(numbers);System.out.println("數字列表: " + numbers);System.out.println("最大值: " + max); // 輸出: 最大值: 15System.out.println("最小值: " + min); // 輸出: 最小值: 3// 使用自定義比較器(按絕對值比較)List<Integer> negativeNumbers = new ArrayList<>();Collections.addAll(negativeNumbers, -10, 5, -8, 3);// 按絕對值找最大值Integer maxAbs = Collections.max(negativeNumbers, Comparator.comparing(Math::abs));System.out.println("絕對值最大: " + maxAbs); // 輸出: 絕對值最大: -10}
}

6、fill

方法聲明:

????????public static <T> void fill(List<? super T> list, T obj)

調用者:

? ? ? ? Collections

參數:

? ? ? ? List<? super T> list:要填充的集合

? ? ? ? T obj:用于填充的對象

返回值:

? ? ? ? void

作用:

? ? ? ? 使用指定的元素替換集合中的所有元素

是否改變原始值:

? ? ? ? 是,會修改原集合

注意事項:

? ? ? ? 集合必須已經有元素,不能是空列表

源碼:

public static <T> void fill(List<? super T> list, T obj) {int size = list.size();if (size < FILL_THRESHOLD || list instanceof RandomAccess) {for (int i=0; i<size; i++)list.set(i, obj);} else {ListIterator<? super T> itr = list.listIterator();for (int i=0; i<size; i++) {itr.next();itr.set(obj);}}
}

源碼解讀:

  • 根據列表大小和是否實現 RandomAccess 接口選擇不同的實現策略
  • 使用索引或迭代器將所有元素替換為指定對象

示例:

import java.util.*;public class FillExample {public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList(new String[5]));System.out.println("填充前: " + list);Collections.fill(list, "default");System.out.println("填充后: " + list);// 輸出: 填充后: [default, default, default, default, default]// 也可以用于初始化List<Integer> numbers = new ArrayList<>(Collections.nCopies(5, 0));System.out.println("初始化: " + numbers);Collections.fill(numbers, 1);System.out.println("填充為1: " + numbers);}
}

7、binarySearch

方法聲明:

????????public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)

????????private static <T> int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key)

調用者:

? ? ? ? Collections

參數:

? ? ? ? List<? extends Comparable<? super T>> list:已降序的集合

? ? ? ? T key:要查找的鍵

? ? ? ? Comparator<? super T> c:比較器(可選)?

返回值:

? ? ? ? int,找到則返回索引,未找到則返回負數

作用:

? ? ? ? 在已排序集合中查找指定元素

是否改變原始值:

? ? ? ? 否,不修改原集合

注意事項:

? ? ? ? 集合必須已經排序

? ? ? ? 返回值為負數時表示未找到,其絕對值減 1 是應該插入的位置

源碼:

public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) {if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)return Collections.indexedBinarySearch(list, key);elsereturn Collections.iteratorBinarySearch(list, key);
}private static <T> int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {int low = 0;int high = list.size()-1;while (low <= high) {int mid = (low + high) >>> 1;Comparable<? super T> midVal = list.get(mid);int cmp = midVal.compareTo(key);if (cmp < 0)low = mid + 1;else if (cmp > 0)high = mid - 1;elsereturn mid; // key found}return -(low + 1);  // key not found
}

源碼解讀:

  • 實現標準的二分查找算法
  • 根據列表是否實現 RandomAccess 接口選擇不同的實現策略

示例:

import java.util.*;public class BinarySearchExample {public static void main(String[] args) {List<Integer> sortedList = new ArrayList<>();Collections.addAll(sortedList, 1, 3, 5, 7, 9, 11, 13);int index = Collections.binarySearch(sortedList, 7);System.out.println("元素7的索引: " + index); // 輸出: 元素7的索引: 3int notFoundIndex = Collections.binarySearch(sortedList, 6);System.out.println("元素6的索引: " + notFoundIndex); // 輸出: 元素6的索引: -4System.out.println("應該插入的位置: " + (Math.abs(notFoundIndex) - 1)); // 輸出: 應該插入的位置: 3}
}

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

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

相關文章

2025 年電賽 C 題 發揮部分 1:多正方形 / 重疊正方形高精度識別與最小邊長測量

2025 年全國大學生電子設計競賽 C 題 發揮部分 1&#xff1a;多正方形 / 重疊正方形高精度識別與最小邊長測量 香橙派 OpenCV C 全流程解析 目錄 賽題背景與需求技術難點全景圖系統總體架構硬件平臺與接線軟件架構與線程模型算法流水線逐幀拆解 6.1 圖像預處理6.2 輪廓提取與…

【自動駕駛】自動駕駛概述 ② ( 自動駕駛技術路徑 | L0 ~ L5 級別自動駕駛 )

文章目錄一、自動駕駛技術路徑1、L0 級別 自動駕駛2、L1 級別 自動駕駛3、L2 級別 自動駕駛4、L3 級別 自動駕駛5、L4 級別 自動駕駛6、L5 級別 自動駕駛一、自動駕駛技術路徑 美國汽車工程師學會 ( SAE ) 將 自動駕駛 分為 L0 ~ L5 六個級別 : 其中 L0 級別 是 完全手動 , L5…

C++少兒編程(二十二)—條件結構

1.理解條件結構小朋友們&#xff0c;今天讓我們一起來探索一個神奇而有趣的知識——程序的條件結構&#xff01;首先&#xff0c;讓我們來想象一個有趣的場景。比如說&#xff0c;你們正在準備去公園玩耍。在出發之前&#xff0c;你們會看看天氣怎么樣。如果天氣晴朗&#xff0…

Ubuntu20.04下Px4使用UORB發布消息

1 .msg文件夾定義數據類型及 變量名文件位置如圖&#xff0c;在PX4-Autopilot/msg文件夾下&#xff0c;筆者創建的文件名為gps_msg.msggps_msg.msg內容如下 uint64 timestamp # 時間戳 float32 latitude float32 longitude float32 altitude 同時&#xff0c;在CM…

three.js學習記錄(第二節:鼠標控制相機移動)

效果展示&#xff1a; 鼠標控制一、鼠標控制 - 軌道控制器&#xff08;OrbitControls&#xff09; 1. 從nodeModules中導入OrbitControls&#xff0c;OrbitControls 是一個附加組件&#xff0c;必須顯式導入 import { OrbitControls } from "three/examples/jsm/controls/…

Shortest Routes II(Floyd最短路)

題目描述There are n cities and m roads between them. Your task is to process q queries where you have to determine the length of the shortest route between two given cities.輸入The first input line has three integers n, m and q: the number of cities, roads…

分享一個基于Hadoop的二手房銷售簽約數據分析與可視化系統,基于Python可視化的二手房銷售數據分析平臺

&#x1f495;&#x1f495;作者&#xff1a;計算機源碼社 &#x1f495;&#x1f495;個人簡介&#xff1a;本人八年開發經驗&#xff0c;擅長Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬蟲、大數據、機器學習等&#xff0c;大家有這一塊的問題…

STM32的PWM

PWM作為硬件中幾乎不可或缺的存在&#xff0c;學會 PWM&#xff0c;等于打通了 STM32 的“定時器體系”。學一次&#xff0c;STM32 全系列&#xff08;甚至 AVR、PIC、ESP32&#xff09;都能通用。硬件只要一個 I/O 就能驅動功率模塊&#xff0c;非常省成本。不會 PWM&#xff…

OpenCompass傻瓜式入門教程

文章目錄1 我也許不是傻瓜&#xff0c;卻只想做個傻瓜2 環境要求3 安裝3.1 下載源碼3.2 創建虛擬環境3.3 安裝4 下載數據5 查看支持的模型和數據集6 評測6.1 指定模型路徑6.2 指定配置文件6.2.1 評測本地qwen2.5模型6.2.1.1 查看opencompass支持的qwen2.5模型6.2.1.2 創建配置文…

【軟件測試】電商購物項目-各個測試點整理(三)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 1、優惠券的測試點…

流處理、實時分析與RAG驅動的Python ETL框架:構建智能數據管道(上)

> **2025年某電商大促,每秒20萬訂單涌入系統**——他們的風控團隊僅用**47毫秒**就識別出欺詐交易。背后的秘密武器,正是融合流處理、實時分析與RAG的下一代Python ETL框架。 ### 一、范式革命:從批處理到AI增強的ETL 4.0 #### 1.1 數據處理演進史 ```mermaid graph LR …

開源 Arkts 鴻蒙應用 開發(十五)自定義繪圖控件--儀表盤

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

???????中國工業企業專利及引用被引用數據說明

1319 中國工業企業專利及引用被引用數據說明數據簡介專利近年發文趨勢及主題分布今天數據皮皮俠團隊為大家分享一份2023年12月25日最新更新的中國工業企業專利及引用被引用數據&#xff0c;供大家研究使用。數據來源原始數據來源于國家統計局&#xff0c;由皮皮俠團隊整理計算。…

MySQL知識點(上)

MySQL知識點 一&#xff1a;MySQL概述 MySQL是一款開源的數據庫軟件&#xff0c;是一種關系型數據庫管理系統&#xff08;ROBMS&#xff09;&#xff0c;也叫做表數據庫管理系統 如果需要快速安全地處理大量的數據&#xff0c;則必須使用數據庫管理系統&#xff1b;任何基于數據…

shell腳本實現sha256sum校驗并拷貝校驗通過的文件

#!/bin/bash# 目標目錄 TARGET_DIR"/appdata/jn1m/versions/old/bin"# 校驗文件 CHECKSUM_FILE"checksum.txt"# 檢查目標目錄是否存在 if [ ! -d "$TARGET_DIR" ]; thenecho "錯誤&#xff1a;目標目錄 $TARGET_DIR 不存在"exit 1 fi#…

中小型泵站物聯網智能控制系統解決方案:構建無人值守的自動化泵站體系

一、系統核心架構與功能設計1.物聯網感知層設備互聯&#xff1a;網關對接壓力傳感器、超聲波液位計、智能電表、振動傳感器等&#xff0c;實時采集水泵運行狀態&#xff08;流量、壓力、溫度、振動&#xff09;、液位、水質&#xff08;pH值、濁度&#xff09;、能耗等關鍵參數…

網絡通信---Axios

1、什么是 Axios&#xff1f; Axios? 是一個基于 ?Promise? 的 ?HTTP 客戶端&#xff0c;用于瀏覽器和 Node.js 環境&#xff0c;用來發送 ?HTTP 請求&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;?。 它常用于&#xff1a; 向后臺 API 發送請求獲取數據提交表…

Ubuntu 軟件源版本不匹配導致的依賴沖突問題及解決方法

在使用 Ubuntu 系統的過程中&#xff0c;軟件包管理是日常操作的重要部分。但有時我們會遇到各種依賴沖突問題&#xff0c;其中軟件源與系統版本不匹配是常見且棘手的一種。本文就來詳細分享一次因軟件源版本不匹配引發的依賴沖突問題&#xff0c;以及具體的解決思路和流程。一…

思考:高速場景的行星輪混動效率如何理解

行星輪混動 E-CVT&#xff08;電子無級變速器&#xff09;是一種專為混合動力汽車設計的動力分配系統&#xff0c;其核心原理是通過行星齒輪組和電機的協同工作&#xff0c;實現動力分流與無級變速。 一、核心結構與組成 E-CVT的核心部件包括 行星齒輪組 和 雙電機&#xff08;…

跨域及解決方案

跨域&#xff08;Cross-Origin&#xff09;是指瀏覽器在執行 JavaScript 的時候&#xff0c;因為同源策略&#xff08;Same-Origin Policy&#xff09;的限制&#xff0c;阻止了一個網頁去請求不同源&#xff08;域名、端口、協議有任意一個不同&#xff09;的資源。 1. 什么是…