当前位置: 首页 > news >正文

Java—可变参数、不可变集合

目录

可变参数

不可变集合


可变参数

Java5 中提供了可变参数,可变参数是一种特殊形参,定义在方法、构造器的形参列表中。

可变参数格式:属性类型...参数名称
可变参数示例:int...args

可变参数传参特点
1. 可以不传参数;
2. 可以传一个或者同时传多个参数;
3. 可以直接传一个数组作为参数。

可变参数优点:常常用来灵活的接收数据。

可变参数注意事项
1. 可变参数在方法内部相当于是一个数组;
2. 一个形参列表中的可变参数只能有一个;
3. 如果除可变参数外还需传递其它参数,则可变参数必须放在形参列表的最后面。

代码示例

public static void main(String[] args) throws ParseException {//可变参数System.out.println(getSum()); // 0System.out.println(getSum(2, 2, 2));// 6System.out.println(getSum(new int[]{1, 1, 1}));// 3System.out.println(getSum2("总和=", 2, 2, 2));// 总和=6}public static int getSum(int... arr) {int sum = 0;for (int i = 0; i < arr.length; i++)sum += arr[i];return sum;
}public static String getSum2(String str, int... arr) {int sum = 0;for (int i = 0; i < arr.length; i++)sum += arr[i];return str + sum;
}

不可变集合

JDK9开始,Java提供了不可变集合。

应用场景
1. 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践;
2. 或者当集合对象被不可信的库调用时,不可变形式是安全的;
3. 简单理解:不想让别人修改集合中的内容。

书写格式
在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。

static<E> List<E> of(E...elements)            //创建一个具有指定元素的List集合对象
static<E> Set<E> of(E...elements)             //创建一个具有指定元素的Set集合对象
static <K,V> Map<K,V> of(E...elements)        //创建一个具有指定元素的Map集合对象

注意:创建后的集合不能进行添加,删除和修改操作。 

代码示例如下

List<Integer> list1 = List.of(1, 2, 3, 4);
List<Integer> list2 = List.of(new Integer[]{1, 2, 3, 4, 5, 6});
//list1.remove(Integer.valueOf(1));//报错,不可变集合不可被修改Set<Integer> set1 = Set.of(1, 2, 3, 4);
Set<Integer> set2 = Set.of(new Integer[]{1, 2, 3, 4, 5, 6});
//Set<Integer> set3 = Set.of(1, 1, 2, 2, 3, 4);//报错:定义一个不可变的Set集合时,需要保证元素的唯一性Map<String, String> map1 = Map.of("key1", "value1", "key2", "value1", "key3", "value3");//值可以不唯一
//Map<String, String> map2 = Map.of("key1", "value1", "key1", "value2");//报错:定义一个不可变Map集合时,需要保证键的唯一性

注意:Map.of 方法最多支持传递 20 个参数,即最多创建 10 对键值对的不可变集合。如果需要创建包含更多键值对的不可变集合,可以使用 Map.ofEntries 方法,并传入键值对数组。以下是使用 Map.ofEntries 创建不可变集合的示例代码。

HashMap<String, String> hm = new HashMap<>();
hm.put("111", "aaa");
hm.put("222", "bbb");
hm.put("333", "ccc");
hm.put("444", "ddd");//获取到Map的所有键值对对象
Set<Map.Entry<String, String>> entries = hm.entrySet();
/**  创建一个长度为0的键值对数组*  Map.Entry[] arr1 = new Map.Entry[0];*  将集合转换为数组形式,需要提供想转换的数组类型,因此toArray()传入的参数为上面创建好的键值对数组*  Map.Entry[] arr2 = entries.toArray(arr1);*  toArray方法在底层会比较集合的长度跟数组的长度*  如果集合的长度 > 数组的长度:说明数据在数组中放不下,此时会根据实际数据的个数,重新创建新数组*  如果集合的长度 ≤ 数组的长度:说明数据在数组中放的下,此时不会创建新的数组,而是直接用传入的数组存放*  以上两行代码可以转化成下面一行* */
Map.Entry[] arr = entries.toArray(new Map.Entry[0]);
// 通过ofEntries方法创建不可变集合
Map map = Map.ofEntries(arr);//代码简化如下
//Map<Object, Object> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));

JDK10开始,JAVA提供了更便捷的方式,我们可以利用Map.copyOf()方法创建多于10 对键值对的不可变集合Map集合。

HashMap<String, String> hm = new HashMap<>();
hm.put("111", "aaa");
hm.put("222", "bbb");
hm.put("333", "ccc");
hm.put("444", "ddd");
Map<String, String> map = Map.copyOf(hm);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java面试宝典-java基础04
  • 为啥有时会出现 4.0 - 3.6 = 0.40000001 这种现象?
  • 多机多卡分布式训练的一种简易实现
  • 栈OJ题——栈的压入、弹出序列
  • Linux服务器不能使用su切换到其他用户
  • 使用C++封装顺序表
  • C++ TinyWebServer项目总结(14. 多线程编程)
  • P2P 文件共享:现代网络中的高效文件传输
  • MySQL主从复制之GTID模式
  • TypeSript11 tsconfig.json配置文件
  • 在容器 (podman) 中运行虚拟机 (QEMU/KVM, libvirt)
  • 从0-1建一个webpack/vue项目,熟悉一下webpack知识点
  • consul 运维中遇到的问题
  • 【jvm】局部变量表与GCRoots之间的关系
  • 仓颉编程语言亮相全国大学生计算机系统能力大赛
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Create React App 使用
  • es6
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Joomla 2.x, 3.x useful code cheatsheet
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • mysql_config not found
  • PHP CLI应用的调试原理
  • supervisor 永不挂掉的进程 安装以及使用
  • Vim Clutch | 面向脚踏板编程……
  • Vim 折腾记
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 仿天猫超市收藏抛物线动画工具库
  • 分布式任务队列Celery
  • 分享几个不错的工具
  • 简单基于spring的redis配置(单机和集群模式)
  • 讲清楚之javascript作用域
  • 如何进阶一名有竞争力的程序员?
  • 使用agvtool更改app version/build
  • 网络应用优化——时延与带宽
  • 学习笔记:对象,原型和继承(1)
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • (1)svelte 教程:hello world
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三十五)大数据实战——Superset可视化平台搭建
  • (算法)求1到1亿间的质数或素数
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • *2 echo、printf、mkdir命令的应用
  • .NET Remoting学习笔记(三)信道
  • .net Signalr 使用笔记
  • .NET 的程序集加载上下文
  • .Net 高效开发之不可错过的实用工具