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

Java-集合类-Arrays.asList()使用需要注意的大坑

Arrays.asList使用需要注意的大坑

    • 大坑
      • 1.不可修改列表大小&&原始数组与列表共享数据
      • 2.对于基本类型数组的使用限制
    • 两个错误案例
      • wrong1
      • wrong2

Arrays.asList() 是 Java 中一个常用的方法,它 用于将数组转换为列表(List)。这个方法非常方便,但也有一些 需要注意的“大坑”

大坑

1.不可修改列表大小&&原始数组与列表共享数据

在这里插入图片描述

Arrays.asList()的源码可知转换后的列表是固定大小,这意味着你不能增加或删除元素,但可以修改现有元素(如果它们是可变对象的话)。转换后得到的列表与原始数组共享相同的底层数组。这意味着对列表的修改会影响到原始数组,反之亦然

  • 不可修改列表元素的类型
Integer[] array = {1, 2, 3};
List<Integer> list = Arrays.asList(array);
// 下面这行代码会抛出 UnsupportedOperationException
list.add(4); // 错误:无法添加元素
  • 原始数组与列表共享数据
Integer[] array = {1, 2, 3};
List<Integer> list = Arrays.asList(array);
list.set(0, 99); // 修改列表的第一个元素
System.out.println(array[0]); // 输出 99,因为数组也被修改了

2.对于基本类型数组的使用限制

​ 如果你尝试用基本类型数组(如 int[])调用 Arrays.asList(),结果并不是你期望的列表,而是一个包含单个元素(即整个数组本身)的列表

int[] primitiveArray = {1, 2, 3};
List<int[]> list = Arrays.asList(primitiveArray);
// list 现在是包含一个元素的列表,这个元素是原始数组 primitiveArray

两个错误案例

wrong1

private static void wrong1() {int[] arr = {1, 2, 3};List list = Arrays.asList(arr);log.info("list:{} size:{} class:{}", list, list.size(), list.get(0).getClass());
}

运行结果:

在这里插入图片描述

​ 按道理输出结果list.size()也应该等于3才对,实际输出了个很奇怪的结果,我们从上诉“大坑2”可知,这里用基本类型数组调用Arrays.asList()了,所以得到的并不是期望的结果

正确方式:

private static void right1() {int[] arr1 = {1, 2, 3};List list1 = Arrays.stream(arr1).boxed().collect(Collectors.toList());log.info("list:{} size:{} class:{}", list1, list1.size(), list1.get(0).getClass());Integer[] arr2 = {1, 2, 3};List list2 = Arrays.asList(arr2);log.info("list:{} size:{} class:{}", list2, list2.size(), list2.get(0).getClass());
}
  • Arrays.stream(arr1)将数组转换为流(Stream),boxed()将流中的int值包装为Integer对象,collect(Collectors.toList())将流收集到一个新的List列表中
  • 最好直接用包装类:Integer[] arr2

运行结果:

在这里插入图片描述

wrong2

private static void wrong2() {String[] arr = {"1", "2", "3"};List list = Arrays.asList(arr);arr[1] = "4";try {list.add("5");} catch (Exception ex) {ex.printStackTrace();}log.info("arr:{} list:{}", Arrays.toString(arr), list);
}

运行结果:

在这里插入图片描述

​ 直接报错。由“大坑1”可知,此处直接往转换后的list中,添加数据,所以直接添加失败

正确方式:

private static void right2() {String[] arr = {"1", "2", "3"};List list = new ArrayList(Arrays.asList(arr));arr[1] = "4";try {list.add("5");} catch (Exception ex) {ex.printStackTrace();}log.info("arr:{} list:{}", Arrays.toString(arr), list);
}

运行结果:

在这里插入图片描述

  • 直接重新new一个ArrayList对象,开辟新的空间即可

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 综合数据分析及可视化实战
  • 力扣hot100:394. 字符串解码(递归/括号匹配,字符串之间相对顺序)
  • 放弃Venn-Upset-花瓣图,拥抱二分网络
  • 无公网IP与服务器完成企业微信网页应用开发远程调试详细流程
  • 36、matlab矩阵特征值、特征向量和奇异值
  • 【python】在【机器学习】与【数据挖掘】中的应用:从基础到【AI大模型】
  • 基于MCGS的双容水箱液位控制系统设计【MCGS+MATLAB+研华工控机】
  • 【第六篇】SpringSecurity的权限管理
  • Mac 下载并激活IDEA
  • 【深度学习】深入解码:提升NLP生成文本的策略与参数详解
  • 代码解读 | Hybrid Transformers for Music Source Separation[05]
  • 卡尔曼滤波的完整流程
  • 线程池介绍与应用
  • 【代码随想录】【算法训练营】【第30天 1】 [322]重新安排行程 [51]N皇后
  • easyexcel的简单使用(execl模板导出)
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • angular组件开发
  • export和import的用法总结
  • Git初体验
  • Git的一些常用操作
  • laravel 用artisan创建自己的模板
  • Object.assign方法不能实现深复制
  • Phpstorm怎样批量删除空行?
  • Spring Boot MyBatis配置多种数据库
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 聊聊directory traversal attack
  • 微信小程序填坑清单
  • 用Visual Studio开发以太坊智能合约
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​​​【收录 Hello 算法】9.4 小结
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # SpringBoot 如何让指定的Bean先加载
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (二)JAVA使用POI操作excel
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (十)T检验-第一部分
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)Scala的“=”符号简介
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)Sql Server 保留几位小数的两种做法
  • (转)项目管理杂谈-我所期望的新人
  • (转载)OpenStack Hacker养成指南
  • ./configure,make,make install的作用(转)
  • .cn根服务器被攻击之后
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core docker部署教程和细节问题
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net OpenCVSharp生成灰度图和二值图