java集合常见的错误

一、码出高效:
集合是开发中需要修改最多的地方,如:从数据库中取出多条数据是 List 结构,然后需要在 Service 进行层层处理,最终为前端展示提供 vo 对象,所以,很多集合使用的规范一定要弄明白。

代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。

强制】ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常;

说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 而是 ArrayList的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。

强制】ArrayList 的 subList 场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生 ConcurrentModificationException 异常;

说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。

强制】使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全一样的数组,大小就是 list.size();

说明

(1)使用 toArray 带参方法,入参分配的数组空间不够大时,toArray 方法内部将重新分配内存空间,并返回新数组地址。

(2)如果数组元素个数大于实际所需,下标为[ list.size() ]的数组元素将被置为null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致;
(3)而直接使用 toArray无参方法存在问题,此方法返回值只能是 Object[]类,若强转其它类型数组将出现 ClassCastException 错误。

强制】使用工具类 Arrays.asList() 把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常;

说明:Arrays.asList() 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList()
体现的是适配器模式,只是转换接口,后台的数据仍是数组。

  • 如果强行改变,如:list.add(“new”) 新元素,会抛出异常;
  • 如果改变数组元素,集合元素也会改变,如:str[0] = “change”,那么 list.get(0)也会随之修改。

【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator(迭代器)方式,如果是并发操作,需要对 Iterator 的对象加锁。

说明:for循环内,如果在直接使用 remove/add 操作,将对原集合的操作,势必改变集合结构,该结构的改变势必影响新一轮的遍历。

List<String> list = new ArrayList<>(); 
list.add("1"); 
list.add("2"); 
Iterator<String> iterator = list.iterator(); 
while (iterator.hasNext()) { String item = iterator.next(); if (删除元素的条件) { iterator.remove(); } 
}

解释都在【码出高效】里,干货都在【总结】里,这里直接上验证方法,可直接运行在 Junit 测试类中:

@Test
public void test_arr_list_set(){// Stream 是通过 Java 8 引入的方法,所以需要最低 Java 8 的支持String[] arr = new String[]{"jimmy","amy","simmy"};List<String> list = Stream.of("father","mather","baby").collect(Collectors.toList());Set<String> set = Stream.of("big","small","middle").collect(Collectors.toSet());/**  - - - - - - - - - - - - 数组、List 互转 - - - - - - - - - - - -  */// 1. 数组转List// 方法①:长度不可变,不可add,remove,否则会报java.lang.UnsupportedOpera// 常见问题见—— 验证①,验证②,验证③List<String> arrToList_1 = Arrays.asList(arr);// 方法①改进:长度灵活可变List<String> arrToList_2 = new ArrayList<>(Arrays.asList(arr));// 方法②:长度灵活可变List<String> arrToList_3 = new ArrayList<>();if (arr != null && arr.length > 0) {for (String tempStr : arr) {arrToList_3.add(tempStr);}}System.out.println("arrToList_1 = " + JSON.toJSONString(arrToList_1));System.out.println("arrToList_2 = " + JSON.toJSONString(arrToList_2));System.out.println("arrToList_3 = " + JSON.toJSONString(arrToList_3));// 2. List转数组:必须使用集合的 toArray(T[] array),传入的是类型完全一样的数组,大小就是 list.size()String[] listToArr = list.toArray(new String[list.size()]);System.out.println("listToArr = " + JSON.toJSONString(listToArr));/**  - - - - - - - - - - - - 数组、Set 互转 - - - - - - - - - - - -  */// 3. 数组转Set:需要先转为List,再转为SetSet arrToSet = new HashSet(Arrays.asList(arr));System.out.println("arrToSet = " + JSON.toJSONString(arrToSet));// 4. Set转数组String[] setToArr = set.toArray(new String[list.size()]);System.out.println("setToArr = " + JSON.toJSONString(setToArr));/**  - - - - - - - - - - - - List、Set 互转 - - - - - - - - - - - -  */// 5. List转Set:转换过程中要保证类型一致,否则会报类型转换异常(ClassCastException)Set<String> listToSet = new HashSet<>(list);System.out.println("listToSet = " + JSON.toJSONString(listToSet));// 6. Set转List:转换过程中要保证类型一致,否则会报类型转换异常(ClassCastException)List<String> setToList = new ArrayList(set);System.out.println("setToList = " + JSON.toJSONString(setToList));/**  - - - - - - - - - - - - 注意事项 + 验证 - - - - - - - - - - - -  */// 验证①:Arrays.asList(arr)下,str[0] = "jiming"; 那么 list.get(0)也会随之修改arr[0] = "jiming";System.out.println("arrToList_1_change = " + JSON.toJSONString(arrToList_1));// 验证②:ArrayList.subList()结果不可强转成ArrayList,否则会报类型转换异常(ClassCastException)// 说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上List<String> subList = list.subList(0,2);System.out.println("subList = " + JSON.toJSONString(subList));subList.set(0, "honey");System.out.println("subList_change = " + JSON.toJSONString(subList));System.out.println("list_original = " + JSON.toJSONString(list));// 验证③: Arrays.asList(arr)下,不支持的操作异常(UnsupportedOperationException)try {arrToList_1.add("exception");} catch (Exception e) {System.out.println("e1 = " + JSON.toJSONString(e.getMessage()));}finally {System.out.println("arrToList_1_add = " + JSON.toJSONString(arrToList_1));}try {arrToList_2.add("exception");} catch (Exception e) {System.out.println("e2 = " + JSON.toJSONString(e.getMessage()));} finally {System.out.println("arrToList_2_add = " + JSON.toJSONString(arrToList_2));}
}

总结

  • 数组 转 List:长度不可变,用 Arrays.asList(arr),例:List arrToList = Arrays.asList(arr);需要长度可变,可使用 Arrays.asList(arr) 的改进方法,例:List arrToList = new ArrayList<>(Arrays.asList(arr));或者,新建 List 使用 foreach 遍历添加进去;
  • List 转 数组:必须使用集合的 toArray(T[] array),传入的是类型完全一样的数组,大小就是 list.size(),例:String[] listToArr = list.toArray(new String[list.size()]);
  • 数组 转 Set:需要先转为List,再转为Set,例:Set arrToSet = new HashSet(Arrays.asList(arr));
  • Set 转 数组:必须使用集合的 toArray(T[] array),传入的是类型完全一样的数组,大小就是 list.size(),例:String[] setToArr = set.toArray(new String[list.size()]);
  • List 转 Set:转换过程中要保证类型一致,例:Set listToSet = new HashSet<>(list);
  • Set 转 List:转换过程中要保证类型一致,例:List setToList = new ArrayList(set)。

原文链接:https://blog.csdn.net/weixin_44259720/article/details/110437544

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

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

相关文章

04-JNI函数

上一篇&#xff1a;03-JNI 类型和数据结构 本章是 JNI 函数的参考章节。它提供了所有 JNI 函数的完整列表。它还介绍了 JNI 函数表的具体布局。 注意&#xff1a;使用 "必须 "一词来描述对 JNI 程序员的限制。例如&#xff0c;当你看到某个 JNI 函数必须接收一个非 N…

7款炫酷的前端动画特效分享(三)(附效果图及在线演示)

分享7款好玩的前端动画特效 其中有CSS动画、SVG动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 CSS3模仿四季交替动画 基于HTML5CSS3实现的卡通风格一年四季交替动画特效 以下效果图只能体现框架的…

超全Chat GPT论文修改指令

文献综述指令润色修改指令论文选题指令论文大指令研究理论指令论文致谢指令参考文献指令论文润色整体逻辑论文整体优化提问指令 1&#xff0e;文献综述指令 请你帮我写一份关于&#xff08;研究主题&#xff09;的文献综述。我的论文选题方向是 XXXX &#xff0c;我已经找到了…

Shell编程——条件测试(五)

在shell编程中&#xff0c;if语句本身不执行任何判断&#xff0c;它实际上接受一个程序作为参数&#xff0c;然后执行这个程序&#xff0c;并依据这个程序的返回值来判断是否执行相应的语句。 程序的返回值是0&#xff0c;则为真&#xff0c;反之则为假。 目录 test命令&…

AIGC笔记--GAN模型的搭建

1--GAN模型的基本概念 经典GAN模型先训练辨别器&#xff0c;再训练生成器&#xff1b; 训练辨别器时&#xff0c;使用分别使用噪声图片和真实图片作为辨别器的输入&#xff0c;噪声图片对应的训练标签为0&#xff0c;真实图片的训练标签为1&#xff0c;使辨别器作二分类任务来学…

YOLOv8-Openvino-ByteTrack【CPU】

YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 注&#xff1a;YOLOv8和YOLOv9代码内容基本一致&#xff01; 全部代码Github&#xff1a;https://gith…

【AutoSar网络管理】唤醒ECU:有效外部网管报文

本专栏将为您提供: Autosar网络管理介绍,包括:状态迁移、状态行为、状态表现、切换条件、时间参数、消息类型等。DUT模拟节点介绍,包括:设计思路、代码展示、编写须知等。测试用例介绍,包括:测试内容、测试步骤、期望结果等。测试脚本介绍,包括:编写思路、代码展示、脚…

阿里云服务器如何通过Java SDK创建ECS实例?

通过Java SDK创建ECS实例的步骤可以概括为以下几个方面&#xff1a; 配置Java SDK环境&#xff1a;在使用Java SDK创建ECS实例前&#xff0c;需要配置好Java SDK环境&#xff0c;并在Maven项目的pom.xml 文件中添加阿里云核心库aliyun。这一步骤是为了确保项目能够正确地使用阿…

对于网络IO的理解

网络IO理解 首先服务端将本机地址和端口bind在listensock上&#xff0c;再用listen()去将listensock套接字设置为listen状态&#xff0c;然后调用accept&#xff0c;进入阻塞状态。如果此时有客户端请求连接&#xff0c;就是第一次握手的开始。 客户端会先调用connect来申请连…

BUUCTF crypto做题记录(13)新手向

一、[MRCTF2020]vigenere 这是一道维吉尼亚密码&#xff0c;但由于不知道密钥&#xff0c;所以我们需要采用爆破的方式。Vigenere Solver | guballa.de 答案&#xff1a;flag{vigenere_crypto_crack_man} 二、[MRCTF2020]keyboard 之前做过一个类似的题目&#xff0c;用九宫格…

C#入门详解_05_C#语言基本元素概览,初识类型、变量与方法,算法简介

本篇对C#语言基本元素概览,初识类型、变量与方法,算法进行简介。 文章目录 1. 构成C#语言的基本元素1.1 关键字(Keyword)1.2 操作符(Operartor)/运算符1.3 标识符(ldentifier )1.3.1 什么是合法的标识符1.4 标点符号1.5 文本(字面值 )1.6 注释与空白2. 初识类型、变量和方法…

97 spring 中的泛型类型注入

前言 呵呵 同样是 最近同事碰到的一个问题 他不太懂 英语, 看到的说明是 缺少一个 RedisTemplate 的实例, 但是找到了一个 RedisTemplate 的实例 呵呵 和我这里 spring 版本似乎是不太一样, 错误信息 有一些差异 以下环境基于 jdk8 spring-5.0.4-RELEASE 测试用例 BeanCon…

day50(vueJS)TypeScript(概念、优势、静态与动态类型、类型约束以及类型注解)

TypeScript介绍 概念优势静态类型与动态类型类型约束 / 类型注解常规类型非常规类型数组类型对象类型万能类型函数类型使用reactive和ref的类型约束父对子传值时的类型约束 概念 它是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 标准&#xff0c;由微软公司开发的自由…

MySQL 新增用户及权限分配

场景&#xff1a; 给MySQL新增一个用户&#xff0c;并且该用户登陆后只能查看和操作有权限的数据库 1、创建用户user_luka, 密码pw123456&#xff0c;%表示所有主机&#xff0c;或者用户连接 MySQL 时所用主机IP&#xff0c;如果在创建的过程中&#xff0c;只给出了用户名&am…

高效备考一级数据分析师考试《CDA Level I 实操训练营》3月30日开课!

曾经报名了考试&#xff0c;买了教程辅导书&#xff0c;却因为各种原因没有坚持学习&#xff0c;这样的经历可能让你感到沮丧和失望。但是&#xff0c;失败并不代表终结&#xff0c;而是迈向成功的必经之路。为了帮助大家能够快速学习考试相关知识&#xff0c;特别为CDA LEVEL …

transformer--解码器

在编码器中实现了编码器的各种组件&#xff0c;其实解码器中使用的也是这些组件&#xff0c;如下图&#xff1a; 解码器组成部分: 由N个解码器层堆叠而成每个解码器层由三个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接第二个子层连…

HarmonyOS4.0入门学习需要学习哪些知识点呢?

HarmonyOS4.0入门学习需要学习哪些知识点&#xff1f;我们需要学习以下知识点&#xff0c;看看你都会吗? 01、HarmonyOS介绍 开发环境搭建 DevEco详解 目录介绍介绍 代码分析 02、HarmonyOS模拟器调试、真机调试 03、ArkTS页面布局 数据类型 条件判断 数组ForEach循环遍历 Lis…

小巧且强大,一键批量操作谁不爱?

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; 两款Office批量打印工具展现了优秀的人性化设计&#xff1a;其界面清晰、操作简便。这些工具支持Word、Excel、PPT等多种文档格式进行批量打印&#…

VMware虚拟机安装linux教程

CentOS7下载 下载 (centos.org)https://www.centos.org/download/新建虚拟机 选择自定义安装 这里要注意兼容性&#xff0c;如果是VMware12创建的虚拟机复制到VM11、10或者更低的版本会出现一不兼容的现象。如果是用VMware10创建的虚拟机在VMware12中打开则不会出现兼容性问题…

洛谷: P1754 球迷购票问题

思路: 记忆化搜索。和洛谷上那道括号匹配的题几乎是一样的。 x是当前剩余50的数量&#xff0c;y是剩余100的数量。 纯暴力三个点超时&#xff0c;所以每次DFS完了&#xff0c;把当前找到的方式数量记录下来&#xff0c;不再重复的去DFS。 代码: #include <bits/stdc.h&g…