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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;​​亚矩阵云手机专业手游推…