Java Collections工具類:高效集合操作

Collections工具類概述

Collections是Java提供的集合操作工具類,位于java.util包中,包含大量靜態方法,用于對ListSetMap等集合進行排序、查找、替換、同步化等操作。


常用方法及代碼示例

排序操作

sort(List<T> list):對List進行自然排序(元素需實現Comparable接口)。
sort(List<T> list, Comparator<? super T> c):根據自定義比較器排序。

List<Integer> numbers = Arrays.asList(3, 1, 4, 2);
Collections.sort(numbers); // 自然排序
System.out.println(numbers); // [1, 2, 3, 4]// 自定義排序(降序)
Collections.sort(numbers, (a, b) -> b - a);
System.out.println(numbers); // [4, 3, 2, 1]

查找操作

binarySearch(List<? extends Comparable<? super T>> list, T key):二分查找(需先排序)。

List<String> words = Arrays.asList("apple", "banana", "cherry");
Collections.sort(words); // 必須先排序
int index = Collections.binarySearch(words, "banana");
System.out.println(index); // 1

反轉與亂序

reverse(List<?> list):反轉集合元素順序。
shuffle(List<?> list):隨機打亂順序。

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
Collections.reverse(list);
System.out.println(list); // [3, 2, 1]Collections.shuffle(list);
System.out.println(list); // 隨機順序如 [2, 1, 3]

同步化集合

synchronizedList(List<T> list):將非線程安全的List轉為線程安全版本。

List<String> unsafeList = new ArrayList<>();
List<String> safeList = Collections.synchronizedList(unsafeList);
// 多線程操作安全

不可變集合

unmodifiableList(List<? extends T> list):返回不可修改的視圖。

List<String> mutable = new ArrayList<>(Arrays.asList("A", "B"));
List<String> immutable = Collections.unmodifiableList(mutable);
immutable.add("C"); // 拋出UnsupportedOperationException

填充與頻率

fill(List<? super T> list, T obj):用指定元素填充集合。
frequency(Collection<?> c, Object o):統計元素出現次數。

List<String> items = new ArrayList<>(Arrays.asList("A", "B", "A"));
Collections.fill(items, "X");
System.out.println(items); // [X, X, X]int freq = Collections.frequency(items, "X");
System.out.println(freq); // 3


其他實用方法

  • max(Collection<? extends T> coll):返回最大值。
  • min(Collection<? extends T> coll):返回最小值。
  • swap(List<?> list, int i, int j):交換元素位置。
List<Integer> nums = Arrays.asList(5, 8, 2);
System.out.println(Collections.max(nums)); // 8
Collections.swap(nums, 0, 2);
System.out.println(nums); // [2, 8, 5]

實例:

package com.itheima.a07mycollections;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class CollectionsDemo2 {public static void main(String[] args) {/*public static <T> boolean addAll(Collection<T> c, T... elements) 批量添加元素public static void shuffle(List<?> list)                        打亂List集合元素的順序public static <T> void sort(List<T> list)                       排序public static <T> void sort(List<T> list, Comparator<T> c)      根據指定的規則進行排序public static <T> int binarySearch (List<T> list,  T key)       以二分查找法查找元素public static <T> void copy(List<T> dest, List<T> src)          拷貝集合中的元素public static <T> int fill (List<T> list,  T obj)               使用指定的元素填充集合public static <T> void max/min(Collection<T> coll)              根據默認的自然排序獲取最大/小值public static <T> void swap(List<?> list, int i, int j)         交換集合中指定位置的元素*/System.out.println("-------------addAll默認規則--------------------------");//1.創建集合ArrayList<String> list = new ArrayList<>();//2.調用方法//批量添加元素Collections.addAll(list,"5","8","1","4","7","9");System.out.println(list);System.out.println("-------------shuffle默認規則--------------------------");//打亂集合元素順序Collections.shuffle(list);System.out.println(list);System.out.println("-------------sort默認規則--------------------------");//默認規則,需要重寫Comparable接口compareTo方法。Integer已經實現,按照從小打大的順序排列//如果是自定義對象,需要自己指定規則ArrayList<Integer> list1 = new ArrayList<>();Collections.addAll(list1, 10, 1, 2, 4, 8, 5, 9, 6, 7, 3);Collections.sort(list1);System.out.println(list1);System.out.println("-------------sort自己指定規則規則--------------------------");Collections.sort(list1, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});System.out.println(list1);Collections.sort(list1, (o1, o2) -> o2 - o1);System.out.println(list1);System.out.println("-------------binarySearch--------------------------");//需要元素有序ArrayList<Integer> list2 = new ArrayList<>();Collections.addAll(list2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);System.out.println(Collections.binarySearch(list2, 9));System.out.println(Collections.binarySearch(list2, 1));System.out.println(Collections.binarySearch(list2, 20));System.out.println("-------------copy--------------------------");//把list3中的元素拷貝到list4中//會覆蓋原來的元素//注意點:如果list3的長度 > list4的長度,方法會報錯ArrayList<Integer> list3 = new ArrayList<>();ArrayList<Integer> list4 = new ArrayList<>();Collections.addAll(list3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);Collections.addAll(list4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);Collections.copy(list4, list3);System.out.println(list3);System.out.println(list4);System.out.println("-------------fill--------------------------");//把集合中現有的所有數據,都修改為指定數據ArrayList<Integer> list5 = new ArrayList<>();Collections.addAll(list5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);Collections.fill(list5, 100);System.out.println(list5);System.out.println("-------------max/min--------------------------");//求最大值或者最小值ArrayList<Integer> list6 = new ArrayList<>();Collections.addAll(list6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);System.out.println(Collections.max(list6));System.out.println(Collections.min(list6));System.out.println("-------------max/min指定規則--------------------------");// String中默認是按照字母的abcdefg順序進行排列的// 現在我要求最長的字符串// 默認的規則無法滿足,可以自己指定規則// 求指定規則的最大值或者最小值ArrayList<String> list7 = new ArrayList<>();Collections.addAll(list7, "a","aa","aaa","aaaa");System.out.println(Collections.max(list7, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.length() - o2.length();}}));System.out.println("-------------swap--------------------------");ArrayList<Integer> list8 = new ArrayList<>();Collections.addAll(list8, 1, 2, 3);Collections.swap(list8,0,2);System.out.println(list8);}
}

練習一:

package test._Collections;import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;public class test02 {public static void main(String[] args) {/*班級里有N個學生,學生屬性:姓名,年齡,性別。實現隨機點名器。*///1.定義集合ArrayList<String> list = new ArrayList<>();//2.添加數據Collections.addAll(list,"范閑","范建","范統","杜子騰","杜琦燕","宋合泛","侯籠藤","朱益群","朱穆朗瑪峰","袁明媛");//方法一://Random r =new Random();
//        int index = r.nextInt(list.size());
//        String s  = list.get(index);
//        System.out.println(s);//方法二:Collections.shuffle(list);System.out.println(list.get(0));}
}

練習二:

package test._Collections;import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;public class test03 {/* 班級里有N個學生要求:70%的概率隨機到男生30%的概率隨機到女生"范閑","范建","范統","杜子騰","宋合泛","侯籠藤","朱益群","朱穆朗瑪峰","杜琦燕","袁明媛","李猜","田蜜蜜",*/public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list,1,1,1,1,1,1,1);Collections.addAll(list,0,0,0);Random r = new Random();int index = r.nextInt(list.size());int number = list.get(index);System.out.println(number);ArrayList<String> boylist = new ArrayList<>();ArrayList<String> girllist = new ArrayList<>();Collections.addAll(boylist, "范閑","范建","范統","杜子騰","宋合泛","侯籠藤","朱益群","朱穆朗瑪峰");Collections.addAll(girllist,"杜琦燕","袁明媛","李猜","田蜜蜜");if(number == 1){int boyindex = r.nextInt(boylist.size());String name = boylist.get(boyindex);System.out.println(name);}else if(number == 0){int girlindex = r.nextInt(girllist.size());String name = girllist.get(girlindex);System.out.println(name);}}
}

練習三:

package test._Collections;import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;public class test04 {/* 班級里有10個學生要求:被點到的學生不會再被點到。但是如果班級中所有的學生都點完了,需要重新開啟第二輪點名。*/public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"范閑","范建","范統","杜子騰","杜琦燕","宋合泛","侯籠藤","朱益群","朱穆朗瑪峰","袁明媛");ArrayList<String> list2 = new ArrayList<>();int count = list.size();Random r = new Random();for (int i = 0; i < 10; i++) {System.out.println("-------第"+i+"輪抽點");for (int j = 0; j < count; j++) {int index = r.nextInt(list.size());String name = list.remove(index);list2.add(name);System.out.println(name);}list.addAll(list2);list2.clear();}}
}

練習四:

package test._Collections;import java.awt.event.KeyListener;
import java.util.*;public class test05 {public static void main(String[] args) {/* 需求定義一個Map集合,鍵用表示省份名稱province,值表示市city,但是市會有多個。添加完畢后,遍歷結果格式如下:江蘇省 = 南京市,揚州市,蘇州市,無錫市,常州市湖北省 = 武漢市,孝感市,十堰市,宜昌市,鄂州市河北省 = 石家莊市,唐山市,邢臺市,保定市,張家口市*///1.創建集合HashMap<String,ArrayList<String>> hm = new HashMap<>();//2.創建單列結合存儲市ArrayList<String> list1 = new ArrayList<>();list1.add("南京市");list1.add("揚州市");list1.add("蘇州市");list1.add("無錫市");list1.add("常州市");ArrayList<String> list2 = new ArrayList<>();list2.add("武漢市");list2.add("孝感市");list2.add("十堰市");list2.add("宜昌市");list2.add("鄂州市");ArrayList<String> list3 = new ArrayList<>();list3.add("石家莊市");list3.add("唐山市");list3.add("邢臺市");list3.add("保定市");list3.add("張家口市");//3.在雙列集合中添加元素hm.put("江蘇省",list1);hm.put("湖北省",list2);hm.put("河北省",list3);//4,通過遍歷對鍵值對對象進行輸出Set<Map.Entry<String,ArrayList<String>>> entries = hm.entrySet();for (Map.Entry<String, ArrayList<String>> entry : entries) {String key = entry.getKey();ArrayList<String> value = entry.getValue();//5.按照需求的格式進行拼接輸出StringJoiner sj = new StringJoiner(",","","");for (String city : value) {sj.add(city);}System.out.println(key+"="+sj);}}
}

通過合理使用Collections工具類,可以簡化集合操作并提升代碼效率。注意線程安全問題和不可變集合的限制。

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

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

相關文章

vue指令總結

vue指令總結 一、總述 二、代碼實現&#xff08;內含大量注釋&#xff09; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>vue入門</title><!-- 使用Vue 3官方CDN --><script src"https://unpkg.c…

RUP——統一軟件開發過程

RUP概述 RUP&#xff08;Rational Unified Process&#xff09;&#xff0c;統一軟件開發過程&#xff0c;統一軟件過程是一個面向對象且基于網絡的程序開發方法論。 在RUP中采用“41”視圖模型來描述軟件系統的體系結構。“41”視圖包括邏輯視圖、實現視圖、進程視圖、部署視…

SpringBoot電腦商城項目--增加減少購物車商品數量

1. 持久層 1.1 規劃sql語句 執行更新t_cart表記錄的num值根據cid查詢購物車的數據是否存在 select * from t_cart where cid#{cid} 1.2 接口和抽象方法 /*** 獲取購物車中商品的數據總數* return 購物車中商品的數據總數*/Cart findByCid(Integer cid); 1.3 xml文件中sql映射…

零基礎學習Redis(13) -- Java使用Redis命令

上期我們學習了如何使用Java連接到redis&#xff0c;這期我們來學習如何在java中使用redis中的一些命令 1. set/get 可以看到jedis類中提供了很多set方法 public static void test1(Jedis jedis) {jedis.flushAll();jedis.set("key1", "v1");jedis.set(&q…

解決OSS存儲桶未創建導致的XML錯誤

前言 在Java開發中&#xff0c;集成對象存儲服務&#xff08;OSS&#xff09;時&#xff0c;開發者常會遇到一個令人困惑的錯誤提示&#xff1a; “This XML file does not appear to have any style information associated with it. The document tree is shown below.” 此…

Spring 表達式語言(SpEL)深度解析:從基礎到高級實戰指南

目錄 一、SpEL是什么&#xff1f;為什么需要它&#xff1f; 核心價值&#xff1a; 典型應用場景&#xff1a; 二、基礎語法快速入門 1. 表達式解析基礎 2. 字面量表示 3. 屬性訪問 三、SpEL核心特性詳解 1. 集合操作 2. 方法調用 3. 運算符大全 4. 類型操作 四、Sp…

算法導論第二十四章 深度學習前沿:從序列建模到創造式AI

第二十四章 深度學習前沿&#xff1a;從序列建模到創造式AI 算法的進化正在重新定義人工智能的邊界 深度學習作為機器學習領域最活躍的分支&#xff0c;正以驚人的速度推動著人工智能的發展。本章將深入探討五大前沿方向&#xff0c;通過原理分析、代碼實現和應用場景展示&…

抽象工廠設計模式

1.問題背景&#xff1a; 現在有兩個產品(Product)分別是手機殼(PhoneCase)和耳機(EarPhone)&#xff0c;但是他們會來自于各個生產廠商&#xff0c;比如說Apple和Android等等 那么至少會有四個產品&#xff0c;分別是安卓手機殼&#xff0c;安卓耳機&#xff0c;蘋果手機殼&a…

GESP 3級 C++ 知識點總結

根據GESP考試大綱 (2024年3月版)&#xff0c;幫大家總結一下GESP 3級 C語言的知識點&#xff1a; 核心目標&#xff1a; 掌握C程序的基本結構&#xff0c;理解并能運用基礎的編程概念解決稍復雜的問題&#xff0c;重點是函數、一維數組和字符串處理。 主要知識點模塊&#x…

騰訊云主動型云蜜罐技術解析:云原生威脅狩獵的革新實踐(基于騰訊云開發者社區技術網頁與行業實踐)

摘要 騰訊云主動型云蜜罐&#xff08;Active Cloud Honeypot&#xff09;通過動態誘捕機制和云原生架構&#xff0c;在威脅檢測效率、攻擊鏈還原深度、防御聯動實時性等維度實現突破。相較于傳統蜜罐&#xff0c;其核心優勢體現在&#xff1a; 部署效率&#xff1a;分鐘級完成…

企業微信wecom/jssdk的使用(入門)

概述 記錄一個企業微信jssdk的使用&#xff0c;因為要用到圖片上傳、掃描二維碼等工具。項目是uniapp開發的h5項目&#xff0c;fastadmin&#xff08;thinkphp5&#xff09;后端 先看官方文檔 https://developer.work.weixin.qq.com/document/path/90547#%E5%BA%94%E7%94%A8…

大零售生態下開源鏈動2+1模式、AI智能名片與S2B2C商城小程序的協同創新研究

摘要&#xff1a;在流量紅利消退、零售形態多元化的背景下&#xff0c;大零售生態成為商業發展的新趨勢。本文聚焦開源鏈動21模式、AI智能名片與S2B2C商城小程序在零售領域的協同應用&#xff0c;探討其如何打破傳統零售邊界&#xff0c;實現流量變現與用戶資產化。研究表明&am…

Scrapy全流程(一)

創建一個scrapy項目:scrapy startproject mySpider 生成一個爬蟲:scrapy genspider douban movie.douban.com 提取數據:完善spider&#xff0c;使用xpath等方法 保存數據:pipeline中保存數據 2 創建scrapy項目 下面以抓取豆瓣top250來學習scrapy的入門使用&#xff1a;豆瓣…

【Elasticsearch】TF-IDF 和 BM25相似性算法

在 Elasticsearch 中&#xff0c;TF-IDF 和 BM25 是兩種常用的文本相似性評分算法&#xff0c;但它們的實現和應用場景有所不同。以下是對這兩種算法的對比以及在 Elasticsearch 中的使用情況&#xff1a; TF-IDF - 定義與原理&#xff1a;TF-IDF 是一種經典的信息檢索算法&am…

【QT】控件二(輸入類控件、多元素控件、容器類控件與布局管理器)

文章目錄 1.輸入類控件1.1 LineEdit1.2 Text Edit1.3 Combo Box1.4 SpinBox1.5 Date Edit & Time Edit1.6 Dial1.7 Slider 2. 多元素控件2.1 List Widget2.2 Table Widget2.3 Tree Widget 3. 容器類控件3.1 Group Box3.2 Tab Widget 4. 布局管理器4.1 垂直布局4.2 水平布局…

【Docker基礎】Docker鏡像管理:docker pull詳解

目錄 1 Docker鏡像基礎概念 1.1 什么是Docker鏡像&#xff1f; 1.2 鏡像與容器的關系 1.3 鏡像倉庫(Registry) 2 docker pull命令詳解 2.1 基本語法 2.2 參數解釋 2.3 拉取鏡像的基本流程 2.4 鏡像分層結構解析 3 docker pull實戰指南 3.1 基本使用示例 3.2 指定鏡…

PixPin:一個強大且免費的截圖貼圖工具

PixPin 是一款國產免費的截圖工具&#xff0c;支持屏幕截圖、屏幕錄制&#xff08;GIF&#xff09;、文字識別&#xff08;OCR&#xff09;以及貼圖等功能。 高效截圖 PixPin 支持自由選擇或自動檢測窗口&#xff0c;自定義截圖區域&#xff0c;像素級精確捕捉&#xff0c;延時…

【測試報告】論壇系統

一、項目背景 1.1 測試目標及測試任務 測試目標旨在保障功能無漏洞、流程順暢&#xff0c;實現多端顯示交互一致&#xff0c;達成高并發場景下響應時間&#xff1c;2 秒等性能指標&#xff0c;抵御 SQL 注入等安全攻擊&#xff0c;提升 UI 易用性與提示友好度&#xff1b; 背…

30天pytorch從入門到熟練(day1)

一、總體工作思路 本項目采用“從零構建”的策略&#xff0c;系統性地開展了深度學習模型的開發與優化工作。其目標在于通過全流程自研方式&#xff0c;深入理解模型構建、訓練優化、推理部署的關鍵技術環節。整體路徑分為以下核心階段&#xff1a; 模型初步構建&#xff1a;以…

Subway Surfers Blast × 亞矩陣云手機:手游矩陣運營的終極變現方案

引爆全球&#xff1a;Subway Surfers Blast的流量紅利?? 隨著Sybo Games最新力作《Subway Surfers Blast》全球上線&#xff0c;這款休閑消除游戲迅速席卷各大應用商店榜單。對于手游推廣者而言&#xff0c;如何高效獲取這波流量紅利&#xff1f;??亞矩陣云手機專業手游推…