26. 可变参数和Collection集合工具类

可变参数与`Collections`

    • 1. 可变参数
      • 1. 概述
      • 2. 格式
      • 3. 代码示例
      • 4. 注意事项
    • 2. `Collections`集合工具类
      • 2.1 概述
      • 2.2 方法
      • 2.3 代码示例
      • 2.4 注意事项

1. 可变参数

1. 概述

可变参数(Variable Arguments)是指在参数列表中允许传入不定个数的参数。在许多编程语言中,可变参数通常用于传递相同类型的参数,并且允许传入任意个数的参数。

  • 可变参数的语法通常是通过使用"..." (省略号)来表示,它可以将传递的参数打包成数组。

例如:

public void method(String... args) {for (String arg : args) {System.out.println(arg);}
}method("Hello", "World");  // 打印结果:Hello World
method("a", "b", "c");  // 打印结果:a b c

2. 格式

  1. 格式:

    修饰符 返回值类型 方法名(参数类型... 形参名){  }
    
  2. 底层

    其实是一个数组,只不过是java已经创建好的

  3. 作用

    在形参中接受多个数据

  4. 注意
    ​ 1. 一个方法只能有一个可变参数
    ​ 2. 如果方法中有多个参数,可变参数要放到最后。

3. 代码示例

  • 代码示例
    需求:利用可变参数求几个数的和
    package text.text02;/*可变参数(JDK5以后):
    1.格式修饰符 返回值类型 方法名(参数类型... 形参名){  }参数类型... 形参名例如:int... args
    2.底层:其实是一个数组,只不过是java已经创建好的
    3.作用:在形参中接受多个数据
    4.注意事项:1.形参列表中可变参数只能有一个2.可变参数必须放在形参列表的最后面需求:利用可变参数求几个数的和*/
    public class text55 {public static void main(String[] args) {int sum = getSum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);System.out.println("这几个数的和为:" + sum);       //这几个数的和为:55}//利用可变参数定义方法public static int getSum(int... args) {int sum = 0;for (int arg : args) {sum = sum + arg;}return sum;}
    }
  • 输出结果
    在这里插入图片描述

4. 注意事项

  1. 可变参数通常应该作为参数列表的最后一个参数,因为在调用函数时,可变参数后面的参数将无法被传递或者识别。

  2. 在函数内部,可变参数实际上被当作一个数组(或者其他类似的数据结构)处理。因此,可以使用数组相关的操作来处理可变参数,如索引访问、遍历等。

  3. 当没有传递任何参数时,可变参数的值将为一个空数组(或者类似结构)。在函数内部,应该适当处理这种情况,以避免出现空指针异常或其他错误。

  4. 可变参数只能用于传递相同类型的参数。如果需要传递不同类型的参数,可以考虑使用重载函数或其他方式来处理。

  5. 使用可变参数时,需要注意参数的顺序。如果同时使用可变参数和其他类型的参数,需要确保传递参数时的顺序是正确的。

2. Collections集合工具类

2.1 概述

Collections 是 Java 编程语言中提供的一个集合工具类,位于 java.util 包中。它提供了一系列静态方法,用于对集合进行常见的操作和算法实现。

Collections 类的主要功能:

  1. 创建不可变集合:Collections 提供了一系列的 emptyXxx() 方法,用于创建不可变的空集合(如 emptyList()emptySet() 等)。

  2. 创建单元素集合:提供了一系列的 singletonXxx() 方法,用于创建只包含一个元素的不可变集合。

  3. 集合操作:提供了一系列的静态方法用于对集合进行操作,如排序、反转、查找、填充等。这些方法包括:sort()shuffle()reverse()binarySearch()fill() 等。

  4. 同步集合:提供了一系列的线程安全的集合类的静态方法(如 synchronizedList()synchronizedSet() 等),用于将现有的集合转换为线程安全的集合,以便在多线程环境下使用。

2.2 方法

方法描述
public static <T> boolean addAll(Collection<T> c, T ... elements)批量添加元素
public static void shuffle(List<?> list)打乱集合顺序
public static <T> void sort(List<T> list)将集合中元素按照默认规则排序(默认规则:需要重写Comparable接口compareTo方法,默认按照从小到大的顺序排列)
public static <T> void sort(List<T> list, Comparator<? super T> c)将集合中元素按照指定规则排序(指定规则在创建对象时指定比较器规则)(自定义对象,需要自己指定规则)
public static <T> int binarySearch(List<? super T> list, T key)以二分查找法查找元素
public static void fill(List<? super T> list, T obj)使用指定元素填充集合
public static <T> T max(Collection<? extends T> coll)返回指定 collection 中的最大元素
public static <T> T min(Collection<? extends T> coll)返回指定 collection 中的最小元素
public static void swap(List<?> list, int i, int j)交换指定列表中指定位置的元素

详细描述

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

    • 描述:批量添加元素到指定集合中。
    • 参数:
      • c:目标集合
      • elements:要添加的元素数组
    • 返回值:如果集合发生更改,则返回 true;否则返回 false
  2. public static void shuffle(List<?> list)

    • 描述:打乱指定列表中元素的顺序。
    • 参数:
      • list:要进行打乱顺序操作的列表。
  3. public static <T> void sort(List<T> list)

    • 描述:将集合中的元素按照默认规则排序。
    • 参数:
      • list:要排序的列表
    • 默认规则:集合中的元素必须实现 Comparable 接口,并重写 compareTo 方法来定义排序规则。默认按照从小到大的顺序排列。
  4. public static <T> void sort(List<T> list, Comparator<? super T> c)

    • 描述:将集合中的元素按照指定规则排序。
    • 参数:
      • list:要排序的列表
      • c:比较器规则,需要在创建对象时指定比较器规则。对于自定义对象,需要自己指定排序规则。
  5. public static <T> int binarySearch(List<? super T> list, T key)

    • 描述:使用二分查找法在指定列表中搜索指定的元素。
    • 参数:
      • list:要进行搜索的有序列表
      • key:要搜索的元素
    • 返回值:如果找到元素,则返回其在列表中的位置;否则返回负数。
  6. public static void fill(List<? super T> list, T obj)

    • 描述:使用指定元素填充列表中的所有元素。
    • 参数:
      • list:要进行填充操作的列表
      • obj:要填充的元素
  7. public static <T> T max(Collection<? extends T> coll)

    • 描述:返回指定 collection 中的最大元素。
    • 参数:
      • coll:要进行查找最大元素的集合
    • 返回值:集合中的最大元素。
  8. public static <T> T min(Collection<? extends T> coll)

    • 描述:返回指定 collection 中的最小元素。
    • 参数:
      • coll:要进行查找最小元素的集合
    • 返回值:集合中的最小元素。
  9. public static void swap(List<?> list, int i, int j)

    • 描述:交换指定列表中指定位置的元素。
    • 参数:
      • list:要进行元素交换的列表
      • ij:要交换的元素索引位置。

2.3 代码示例

  • 代码示例
package text.text02;import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.function.Consumer;/*Collections:集合工具类
1.java.util.Collections:是集合的工具类
2.作用:Collections不是集合,而是集合的工具类
3.方法:
public static <T> boolean addAll(Collection <T> c,T ... elements)`:批量添加元素
public static void shuffle(List<?> list) `:打乱集合顺序
public static <T> void sort(List<T> list)`:将集合中元素按照默认规则排序默认规则:需要重写Comparable接口compareTo方法,默认按照从小到大的顺序排列public static <T> void sort(List<T> list,Comparator<? super T> )`:将集合中元素按照指定规则排序指定规则:在创建对象时,指定比较器规则(自定义对象,需要自己指定规则)public static <T> int binarySearch(List<? super T> list, T key)` :以二分查找法查找元素前提元素必须有序,该方法返回的是该元素所在的索引public static void fill(List<? super T> list, T obj)`: 使用指定元素填充集合
public static <T> T max(Collection<? extends T> coll)` : 返回指定 Collection 中的最大元素
public static <T> T min(Collection<? extends T> coll)` : 返回指定 Collection 中的最小元素
public static void swap(List<?> list, int i, int j)` :交换指定列表中指定位置的元素*/
public class text56 {public static void main(String[] args) {//1.public static <T> boolean addAll(Collection <T> c,T ... elements)`:批量添加元素System.out.println("===================== 1.批量添加元素 =====================");//创建集合Collection<String> list1 = new ArrayList<>();//添加元素Collections.addAll(list1, "abc", "def", "ghi", "jkl", "mno", "por");//遍历集合list1.forEach(new Consumer<String>() {@Overridepublic void accept(String str) {System.out.print(str + "  ");      //abc  def  ghi  jkl  mno  por}});System.out.println();//2.public static void shuffle(List<?> list) `:打乱集合顺序System.out.println("===================== 2.打乱集合顺序 =====================");//创建集合ArrayList<String> list2 = new ArrayList<>();//添加元素Collections.addAll(list2, "abc", "def", "ghi", "jkl", "mno", "por");//打乱元素Collections.shuffle(list2);//遍历集合for (String str : list2) {System.out.print(str + "  ");     //打乱顺序了,每次输出结果都不一样}System.out.println();//3.public static <T> void sort(List<T> list)`:将集合中元素按照默认规则排序System.out.println("===================== 3.将集合中元素按照默认规则排序 =====================");//默认规则:需要重写Comparable接口compareTo方法,默认按照从小到大的顺序排列//创建集合ArrayList<String> list3 = new ArrayList<>();//添加元素Collections.addAll(list3, "0004", "0002", "0006", "0001", "0003", "0005");//默认规则排序(即从小到大排列)Collections.sort(list3);//遍历集合for (String str : list3) {System.out.print(str + "  ");       //0001  0002  0003  0004  0005  0006}System.out.println();//4.public static <T> void sort(List<T> list,Comparator<? super T> )`:将集合中元素按照指定规则排序System.out.println("===================== 4.将集合中元素按照指定规则排序 =====================");//指定规则:在创建对象时,指定比较器规则(自定义对象,需要自己指定规则)//创建集合ArrayList<String> list4 = new ArrayList<>();//添加元素Collections.addAll(list4, "0004", "0002", "0006", "0001", "0003", "0005");//指定规则排序Collections.sort(list4, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o2.compareTo(o1);}});//遍历集合for (String str : list4) {System.out.print(str + "  ");       //0006  0005  0004  0003  0002  0001}System.out.println();//5.public static <T> int binarySearch(List<? super T> list, T key)` :以二分查找法查找元素System.out.println("===================== 5.以二分查找法查找元素 =====================");//前提元素必须有序//创建集合ArrayList<Integer> list5 = new ArrayList<>();//添加元素Collections.addAll(list5, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10);//二分查找法查找元素//该方法返回的是该元素所在的索引int binarySearch = Collections.binarySearch(list5, 6);System.out.println("该元素所在的索引为:" + binarySearch);       //该元素所在的索引为:5//遍历集合for (Integer str : list5) {System.out.print(str + "  ");       //1  2  3  4  5  6  7  8  8  9  10}System.out.println();//6.public static void fill(List<? super T> list, T obj)`: 使用指定元素填充集合System.out.println("===================== 6.使用指定元素填充集合 =====================");//创建集合ArrayList<Integer> list6 = new ArrayList<>();//添加元素Collections.addAll(list6, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10);//指定元素填充集合Collections.fill(list6, 1314);//遍历集合for (Integer str : list6) {System.out.print(str + "  ");       //1314  1314  1314  1314  1314  1314  1314  1314  1314  1314  1314}System.out.println();//7.public static <T> T max(Collection<? extends T> coll)`:返回指定Collection 中的最大元素System.out.println("===================== 7.返回指定Collection 中的最大元素 =====================");//创建集合ArrayList<Integer> list7 = new ArrayList<>();//添加元素Collections.addAll(list7, 1, 2, 3, 4, 5, 1314, 520, 6, 7, 8, 8, 9, 10);//返回指定Collection 中的最大元素Integer max = Collections.max(list7);System.out.println("最大元素为:" + max);        //最大元素为:1314//遍历集合for (Integer str : list7) {System.out.print(str + "  ");       //1  2  3  4  5  1314  520  6  7  8  8  9  10}System.out.println();//8.public static <T> T min(Collection<? extends T> coll)`:返回指定 Collection 中的最小元素System.out.println("===================== 8.返回指定 Collection 中的最小元素 =====================");//创建集合ArrayList<Integer> list8 = new ArrayList<>();//添加元素Collections.addAll(list8, 1, 2, 3, 4, 5, 0, -1, 6, 7, 8, 8, 9, 10);//返回指定Collection 中的最小元素Integer min = Collections.min(list8);System.out.println("最小元素为:" + min);        //最小元素为:-1//遍历集合for (Integer str : list8) {System.out.print(str + "  ");       //1  2  3  4  5  0  -1  6  7  8  8  9  10}System.out.println();//9.public static void swap(List<?> list, int i, int j)` :交换指定列表中指定位置的元素System.out.println("===================== 9.交换指定列表中指定位置的元素 =====================");//创建集合ArrayList<Integer> list9 = new ArrayList<>();//添加元素Collections.addAll(list9, 1, 2, 3, 4, 5, 0, -1, 6, 7, 8, 8, 9, 10);//交换指定列表中指定位置的元素Collections.swap(list9, 0, 12);//遍历集合for (Integer str : list9) {System.out.print(str + "  ");       //10  2  3  4  5  0  -1  6  7  8  8  9  1  }}
}
  • 输出结果
    • 1.批量添加元素
      在这里插入图片描述

    • 2.打乱集合顺序
      在这里插入图片描述

    • 3.将集合中元素按照默认规则排序
      在这里插入图片描述

    • 4.将集合中元素按照指定规则排序
      在这里插入图片描述

    • 5.以二分查找法查找元素
      在这里插入图片描述

    • 6.使用指定元素填充集合
      在这里插入图片描述

    • 7.返回指定Collection 中的最大元素
      在这里插入图片描述

    • 8.返回指定 Collection 中的最小元素
      在这里插入图片描述

    • 9.交换指定列表中指定位置的元素
      在这里插入图片描述

2.4 注意事项

  1. 集合的同步性:Collections 类提供了一些线程安全的集合方法,如 synchronizedList()synchronizedSet() 等。但是需要注意,这些方法只是将现有的集合转换为线程安全的集合,并不能保证对集合中的元素的操作是原子性的。如果需要在多线程环境下对集合进行并发操作,建议使用并发集合类 (如 ConcurrentHashMapCopyOnWriteArrayList 等)来代替。

  2. 不可变集合: Collections 类提供了创建不可变集合的方法(如 unmodifiableList()unmodifiableSet()),返回的不可变集合不允许对其进行修改操作。需要注意的是,如果原始的集合发生了变化,不可变集合可能会反映这些变化。因此,当需要确保集合不会被修改时,应该使用不可变集合。

  3. 自然排序和自定义排序:Collections.sort() 方法用于对集合进行排序,默认使用集合元素的自然顺序,即元素的类必须实现 Comparable 接口并重写 compareTo() 方法。如果需要使用自定义排序规则,可以使用重载的 sort() 方法,其中传入一个自定义的比较器 Comparator。

  4. 对象的比较和相等:在使用排序或查找方法时,需要确保集合中的元素正确地实现了 equals()compareTo() 方法,以保证比较和查找的准确性。

  5. 注意泛型的使用:Collections 类中的方法通常使用了泛型来增加灵活性和类型安全性。在使用这些方法时,需要注意传入的集合类型和元素类型需要匹配。

  6. 注意性能和效率:某些 Collections 方法的实现可能会产生额外的开销,比如排序方法可能需要额外的内存空间。在处理大量数据时,需要考虑这些性能和效率因素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《动手学深度学习(PyTorch版)》笔记7.6

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

如何在CentOS7上使用防火墙保护Docker容器的端口

防火墙设置对Docker容器内开放的端口无效&#xff1f; 在主机或虚机上运行Docker容器时&#xff0c;即便主机启用了firewalld服务&#xff0c;仍然存在一些安全隐患&#xff0c;尤其是当Docker容器内打开端口并监听0.0.0.0时&#xff0c;存在即使通过firewall-cmd配置了阻止某…

前端主流框架:项目运行命令 npm 详解

作为一位资深前端开发&#xff0c;我对npm&#xff08;Node Package Manager&#xff09;的使用有着深入的了解。npm是Node.js的包管理器&#xff0c;用于安装、管理和删除各种前端库和工具。现在&#xff0c;让我们深入了解npm在Vue、React、Angular和Vue 3项目中的一些基本使…

【软件工程导论】实验二——编制数据字典(数字化校园系统案例分析)

数字化校园系统案例分析 问题定义实验内容编制内容1数据项数据流处理逻辑数据存储 2外部实体 问题定义 数字化校园系统期望以数字化信息和网络为基础&#xff0c;在计算机和网络技术上建立起对教学、科研、管理、技术服务、生活服务等校园信息的收集、处理、整合、存储、传输和…

嵌入式Qt 第一个Qt项目

一.创建Qt项目 打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项 弹出New Project对话框&#xff0c;选择Qt Widgets Application 选择【Choose】按钮&#xff0c;弹出如下对话框 设置项目名称和路径&#xff0c;按照向导进行下一步 选…

EMC学习笔记(二十六)降低EMI的PCB设计指南(六)

降低EMI的PCB设计指南&#xff08;六&#xff09; 1.PCB布局1.1 带键盘和显示器的前置面板PCB在汽车和消费类应用中的应用1.2 敏感元器件的布局1.3 自动布线器 2.屏蔽2.1 工作原理2.2 屏蔽接地2.3 电缆屏蔽至旁路2.4 缝隙天线&#xff1a;冷却槽和缝隙 tips&#xff1a;资料主要…

MySQL篇----第二十一篇

系列文章目录 文章目录 系列文章目录前言一、什么是乐观锁二、什么是悲观锁三、什么是时间戳四、什么是行级锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

无人机概述及系统组成,无人机系统的构成

无人机的定义 无人驾驶航空器&#xff0c;是一架由遥控站管理&#xff08;包括远程操纵或自主飞行&#xff09;的航空器&#xff0c;也称遥控驾驶航空器&#xff0c;以下简称无人机。 无人机系统的定义 无人机系统&#xff0c;也称无人驾驶航空器系统&#xff0c;是指一架无人…

屏幕字体种类介绍

[ Script and font support in Windows ] [Windows 中的脚本和字体支持&#xff3d; 在Windows 2000 以前&#xff0c;Windows 的每个主要版本都会添加对新脚本的文本显示支持。本文介绍了每个主要版本中的更改。 Since before Windows 2000, text-display support for new scr…

树莓派4B(Raspberry Pi 4B)使用docker搭建springBoot/springCloud服务

树莓派4B&#xff08;Raspberry Pi 4B&#xff09;使用docker搭建springBoot/springCloud服务 前提&#xff1a;本文基于Ubuntu&#xff0c;Java8&#xff0c;SpringBoot 2.6.13讲解 准备工作 准备SpringBoot/SpringCloud项目jar包 用 maven 打包springBoot/springCloud项目&…

idea中vue文件如何快捷打出html标签结构,不写<

例如写一个<button></button>标签&#xff1a;快捷键如下 先写一个button&#xff0c;然后再按tab键即可自动生成一对标签。 演示&#xff1a; 步骤一&#xff1a; 步骤二&#xff1a;

PHP中读取(截取substr)字符串前N个字符或者从第几个字符开始取几个字符

html <?php $str "123456789";echo substr($str , 0 , 3);//从左边第一位字符起截取3位字符&#xff1a;结果&#xff1a;123echo substr($str , 3 , 3);//从左边第3位字符起截取3位字符&#xff1a;结果&#xff1a;456?> html <?php$rest substr(&…

【华为OD机试】 最长子字符串的长度(一)【2024 C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给你一个字符串 s,首尾相连成一个环形,请你在环中找出 o 字符出现了偶数次最长子字符串的长度。 输入描述 输入是一个小写字母组成的字符串 输出描述 输出是一个整数 备注 1 ≤ s.length…

STM32 STD/HAL库驱动W25Q64模块读写字库数据+OLED0.96显示例程

STM32 STD/HAL库驱动W25Q64 模块读写字库数据OLED0.96显示例程 &#x1f3ac;原创作者对W25Q64保存汉字字库演示&#xff1a; W25Q64保存汉字字库 &#x1f39e;测试字体显示效果&#xff1a; &#x1f4d1;功能实现说明 利用W25Q64保存汉字字库&#xff0c;OLED显示汉字的时…

Rust基础拾遗--辅助功能

Rust基础拾遗 前言1.错误处理1.1 panic为什么是 Result 2. create与模块3. 宏4. 不安全代码5. 外部函数 前言 通过Rust程序设计-第二版笔记的形式对Rust相关重点知识进行汇总&#xff0c;读者通读此系列文章就可以轻松的把该语言基础捡起来。 1.错误处理 Rust 中的两类错误处理…

寒假作业——2/13

作业1 作业2 cp cp 当前的文件位置 复制到哪个位置 格式 : cp 路径/文件 路径/目录名/重新命名的目录名 mv mv 当前的文件位置 复制到哪个位置 格式 : mv 路径/文件 路径/目录名/重新命名的目录名 也可进行重命名操作 find 查找文件 find 目标路径 -name 文件名 后续…

vue监视和深度监视

vue监视 监视属性watch 1.监视的属性变化时&#xff0c;回调函数自动调用&#xff0c;自动操作 2.监视的属性一定要存在&#xff0c;才可以进行监视 3.监视的写法 1.new vue的时候传入watch配置 2.通过vm.$watch监视 vue监视深度 深度监视 1.vue中的watch默认不检测对象内部…

leetcode(数组)128.最长连续序列(c++详细解释)DAY8

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 示例 1&a…

政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(二){Image tutorial}·{Python语言}

咱们接着上一篇&#xff0c;这次咱们讲使用Matplotlib绘制图像的简短尝试。 我的这个系列的上一篇文章在这里&#xff1a; 政安晨&#xff1a;在Jupyter中【示例演绎】Matplotlib的官方指南&#xff08;一&#xff09;{Pyplot tutorial}https://blog.csdn.net/snowdenkeke/ar…

IM聊天系统为什么需要做消息幂等?如何使用Redis以及Lua脚本做消息幂等【第12期】

0前言 消息收发模型 第一张图是一个时序图&#xff0c;第二张图是一个标清楚步骤的流程图&#xff0c;更加清晰。消息的插入环节主要在2步。save部分。主要也是对这个部分就行消息幂等的操作。 前情提要&#xff1a;使用Redis发布 token 以及lua脚本来共同完成消息的幂等 目…