List的add(int index,E element)陷阱,不得不防

项目场景:

项目中有两个List列表,一个是List1用来存储一个标识,后续会根据这个标识去重。
一个List2是用来返回对象的,其中对象里也有一个属性List3。现需要将重复的标识数据追加到List3

我想到的两个方案:

  1. 尽量不动原来的代码,用两个Map来解决,一个Map用来存储标识,一个Map用来存储Key所在集合的位置。
  2. 修改原来的代码,直接存在Map中,最终再将Map的值转为List。

最终我选择了方案1


问题描述

存储索引位置的时候,因为不存在重复项的就直接跳出循环了,导致索引越界异常,这里因为无法提供内部代码,就用一个模拟代码展示:

public class IndexOutOfBoundsExceptionExample {public static void main(String[] args) {List<String> myList = new ArrayList<>();// 添加一些元素myList.add("A");myList.add("B");myList.add("C");// 尝试在索引位置 10 插入元素,超出了列表的大小try {myList.add(10, "Element"); // 这里引发 IndexOutOfBoundsException} catch (IndexOutOfBoundsException e) {System.out.println("捕获到索引越界异常:" + e.getMessage());}}
}

运行结果:
在这里插入图片描述


原因分析:

在这里插入图片描述
通过源码我们可以看到映入眼帘的就是索引越界异常的原因:

  1. 索引的位置小于0
  2. 索引的位置大于集合中的size也就是元素的大小。

这里还有一个情况,就是集合元素为空的时候也会出现索引越界:

public class IndexOutOfBoundsExceptionExample {public static void main(String[] args) {List<String> myList = new ArrayList<>();// 尝试在索引位置 5 插入元素,但列表为空try {myList.add(5, "Element"); // 这里将会引发 IndexOutOfBoundsException} catch (IndexOutOfBoundsException e) {System.out.println("捕获到索引越界异常:" + e.getMessage());}}
}

运行结果:
在这里插入图片描述


解决方案:

  1. 如果不满足条件的就new一个空对象放进去
  2. 直接舍弃采用方案1,哈哈哈。

因为可能要考虑的地方有很多,每个地方都要去new一个空对象放进去显然不友好,最终我还是选择了方案1哈。这里也说下方案1:
伪代码:

Collection<String> c=Map.values()
ArrayList<String> list=new ArrayList<>(c)

思考

为什么要这样设计,一定要控制索引在有效的范围内(0 到 size-1)。
我个人认为有以下几点:

  1. 空间浪费,如果说我们需要遍历的数据很大的话,那么用来存储的List就需要不断的进行扩容。
  2. 破坏了原本的数据特性,List本身是一个有序的数据结构,如果我们需要进行其他的比较操作或者按顺序取数据就会增加额外的判断。
  3. 意想不到的错误。

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

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

相关文章

【Java笔试强训】Day7(WY22 Fibonacci数列、CM46 合法括号序列判断)

Fibonacci数列 链接&#xff1a;Fibonacci数列 题目&#xff1a; Fibonacci数列是这样定义的&#xff1a; F[0] 0 F[1] 1 for each i ≥ 2: F[i] F[i-1] F[i-2] 因此&#xff0c;Fibonacci数列就形如&#xff1a;0, 1, 1, 2, 3, 5, 8, 13, …&#xff0c;在Fibonacci数列…

短期经济波动:均衡国民收入决定理论(一

宏观经济学讲义 10 短期经济波动&#xff1a;均衡国民收入决定理论(一) 文章目录 10 短期经济波动&#xff1a;均衡国民收入决定理论(一)[toc]1 均衡国民收入决定1.1 均衡国民收入决定的不同理论1.2 两部门经济&#xff1a;有效需求原理和框架1.2.1 模型假设1.2.2 模型推导1.2…

[架构之路-246/创业之路-77]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 客户关系管理系统CRM

目录 前言&#xff1a; 一、企业信息化的结果&#xff1a;常见企业信息化软件 1.1 客户关系管理系统CRM 1.1.1 什么是客户关系管理系统 1.1.2 CRM总体架构 1.1.3 什么类型的企业需要CRM 1.1.4 创业公司在什么阶段需要CRM 1.1.5 研发型创业公司什么时候需要CRM 1.1.6 C…

草柴返利APP如何领取天猫淘宝红包优惠券享淘礼金红包0元购物福利?

什么是草柴返利APP&#xff1f; 草柴APP是一款淘宝/天猫、京东等电商平台购物前查询领取大额内部隐藏优惠券&#xff0c;确认收货后拿购物返利的省钱工具。同时&#xff0c;草柴APP上线隐藏的红包功能&#xff0c;查询到淘宝/天猫、京东商品优惠券、返利结果&#xff0c;点击进…

2023年【安全员-C证】报名考试及安全员-C证考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证报名考试根据新安全员-C证考试大纲要求&#xff0c;安全生产模拟考试一点通将安全员-C证模拟考试试题进行汇编&#xff0c;组成一套安全员-C证全真模拟考试试题&#xff0c;学员可通过安全员-C证考试内容全…

初学编程入门基础教学视频,中文编程开发语言工具箱之豪华编辑构件,免费版中文编程软件下载

初学编程入门基础教学视频&#xff0c;中文编程开发语言工具箱之豪华编辑构件&#xff0c;免费版中文编程软件下载 构件的其中一个属性、方法&#xff0c;查找内容&#xff0c;替换内容。 构件工具箱非常丰富&#xff0c;其中该构件在 文本件构件板菜单下。 编程系统化课程总目…

数据结构:算法(特性,时间复杂度,空间复杂度)

目录 1.算法的概念2.算法的特性1.有穷性2.确定性3.可行性4.输入5.输出 3.好算法的特质1.正确性2.可读性3.健壮性4.高效率与低存储需求 4.算法的时间复杂度1.事后统计的问题2.复杂度表示的计算1.加法规则2.乘法规则3.常见函数数量级比较 5.算法的空间复杂度1.程序的内存需求2.例…

目标检测理论知识

目标检测 1.基本概念 目标检测&#xff08;Object Detection&#xff09;的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定它们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态&#xff0c;…

【Note详细图解】中缀表达式如何转为后缀表达式?数据结构

中缀表达式 中缀表达式&#xff08;中缀记法&#xff09;是一个通用的算术或逻辑公式表示方法&#xff0c;操作符是以中缀形式处于操作数的中间&#xff08;例&#xff1a;3 4&#xff09;&#xff0c;中缀表达式是人们常用的算术表示方法。 前缀或后缀记法不同的是&#xf…

【腾讯云 TDSQL-C Serverless 产品体验】TDSQL-C MySQL Serverless最佳实践

一、引言&#xff1a; 随着云计算技术的不断发展&#xff0c;越来越多的企业开始选择将自己的数据库部署在云上&#xff0c;以更好了的支持企业数字化转型以及业务创新&#xff0c;在这个过程中&#xff0c;很多客户会遇到这样一个问题&#xff0c;业务会存在高峰期和低谷期&a…

hadoop权威指南第四版

第一部分 HaDOOP基础知识 1.1 面临的问题 存储越来越大&#xff0c;读写跟不上。 并行读多个磁盘。 问题1 磁盘损坏 – 备份数据HDFS 问题2 读取多个磁盘用于分析&#xff0c;数据容易出错 --MR 编程模型 1.2 衍生品 1 在线访问的组件是hbase 。一种使用hdfs底层存储的模型。…

HTML基本概念:

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 1&#xff09;、HTML 是用来描述网页的一种语言。 2&#xff09;、HTML 不是一种编程语言&am…