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

news2024/9/27 17:24:54

项目场景:

项目中有两个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.coloradmin.cn/o/1151377.html

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

相关文章

设计工位卡片

因为今天接到了一个设计工位卡片的任务&#xff0c;于是在这里记录一哈&#xff0c;设计卡片所需要的一些东西&#xff1a; 设计卡片的网站有以下几个可供参考&#xff1a; Canva&#xff1a;提供各种类型的卡片设计模板&#xff0c;包括圣诞贺卡、生日贺卡、感谢卡等&#x…

CL_MVSNet复现可能会出现的问题汇总

1.最好按照说明文档要求配好python3.7和pytorch1.0 2. 【已解决】 FutureWarning: The module torch.distributed.launch is deprecated and will be removed in future. torch.distributed.launch被弃用&#xff0c;考虑使用torchrun模块进行替换。 解决方案&#xff1a; 将…

pyzed.sl 突然 ImportError: DLL load failed while importing sl: 找不到指定的程序。 的解决

问题描述 >>> import pyzed.sl Traceback (most recent call last):File "<stdin>", line 1, in <module> ImportError: DLL load failed while importing sl: 找不到指定的程序。解决 1 按网上说的&#xff0c;将bin文件夹下所有dll复制到py…

2023年美团外卖商家数据(含销量)

2023年美团外卖商家、地址、电话、经纬度、起送价、月销量、评分、经营许可

前端移动web高级详细解析三

模拟移动设备&#xff0c;方便查看页面效果 屏幕分辨率 分类&#xff1a; 物理分辨率&#xff1a;硬件分辨率&#xff08;出厂设置&#xff09; 逻辑分辨率&#xff1a;软件 / 驱动设置 结论&#xff1a;制作网页参考 逻辑分辨率 视口 作用&#xff1a;显示 HTML 网页的区…

数据结构:绪论(数据对象,逻辑结构,数据的运算,物理结构)

目录 1.数据2.数据元素、数据项3.数据对象4.数据结构1.逻辑结构1.集合结构2.线性结构3.树形结构4.图状结构 2.数据的运算3.物理结构&#xff08;存储结构&#xff09;1.顺序存储2.链式存储3.索引存储4.散列存储 4.数据结构的选择 5.数据类型 1.数据 数据是信息的载体&#xff0…

返利管理系统建设指南

目录 引子 一、返利业务模式介绍 1. 什么是返利 2. 返利与优惠区别 3. 业务模式 4. 返利管理业务流程 二、返利系统建设说明 1. 业务架构 2. 主要功能 三、结束语 引子 返利作为供应商在商业活动开拓新市场、挖掘存量市场潜力&#xff0c;激励经销商的销售策略&…

Mac/Linux类虚拟机_CrossOver虚拟机CrossOver 23.6正式发布2024全新功能解析

CodeWeivers 公司于今年 10 月发布了 CrossOver 23.6 测试版&#xff0c;重点添加了对 DirectX 12 支持&#xff0c;从而在 Mac 上更好地模拟运行 Windows 游戏。 该公司今天发布新闻稿&#xff0c;表示正式发布 CrossOver 23 稳定版&#xff0c;在诸多新增功能中&#xff0c;最…

HackerOne支付给道德黑客超过3亿美元的漏洞赏金

导语 近日&#xff0c;HackerOne宣布自其成立以来&#xff0c;其漏洞赏金计划已经支付给道德黑客和漏洞研究人员超过3亿美元的奖励。这个数字令人瞠目结舌&#xff0c;展示了道德黑客在网络安全中的重要性。让我们一起来看看HackerOne的成就和一些有趣的数据。 道德黑客的奖励 …

项目资源管理-考试重点

1. 冲突管理的5种方法 ① 撤退/回避 ② 缓和/包容 ③ 妥协/调解 ④ 强迫/命令 ⑤ 合作/解决问题 2. 虚拟团队的优缺点 优点&#xff1a; ① 能够利用不在同一地理区域的专家的专业技术 ② 将在家办公的员工纳入团队 ③ 以及将行动不便者或残疾人纳入团队 缺点&#…

codeforces (C++ Doremy‘s Paint 3)

题目&#xff1a; 翻译&#xff1a; 思路&#xff1a; 1、题目意思&#xff1a;将数组中的数进行排列&#xff0c;任意相邻两个数的和都相等&#xff0c;才能说这个数组为好。一下分三种情况讨论。 2、当数组中有三种及三种以上的数字&#xff0c;那任意相邻两个数的和都相等必…

【算法】染色法判定二分图

题目 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数 n 和 m。 接下来 m 行&#xff0c;每行包含两个整数 u 和 v&#xff0c;表示点 u 和点 v 之间存在一条边。 输出格式 如果给定图是二分…

Linux网络编程02

UDP协议 UDP协议处于传输层&#xff0c;是不可靠谱、无连接、消息有边界的协议 TCP类似于管道&#xff0c;UDP类似于队列 UDP头部 传输层头部都不需要IP地址&#xff0c;都只需要端口号 Berkeley Socket&#xff08;库&#xff09; Berkeley Scoket 库已经完成了传输层之下…

【Xilinx Kintex-7 Virtex-7 LVDS bank电压】

各种介绍很多&#xff0c;也都写的似乎很长很详细&#xff0c;但有错误。 详细的查阅Xilinx 论坛 43989 核心 总结一下就是Xilinx 7serious 的FPGA ,你如果要配置成LVDS,这的LVDS是正儿八经的那种&#xff0c;那么FPGA 这块你只需要记住两点就可以。 第一&#xff0c;假如你…

docker-compose 简单部署Flask + Redis + Nginx环境搭建网站

主博客目录&#xff1a;《从零开始学习搭建量化平台笔记》 主项目计划需要搭建一个 Flask Redis Nginx环境 来制作一个可视化的网站&#xff0c;为了避免搭完就忘&#xff0c;因此就有了这个博客。 任务&#xff1a;搭建一个内网通信且只有由Nginx代理发放的网页端显示环境。…

Unity多人同时在线海量玩家角色的架构与设计

前言 Unity多人同时在线的游戏会有很大的地图&#xff0c;大量的玩家同时在线,以及玩家会有不同的游戏职业&#xff0c;这样众多的玩家游戏角色我们客户端应该如何来设计呢&#xff1f;本文来分享以下几个点 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家…

腾讯待办小程序关停怎么办?可替代的智能待办提醒工具

有不少小伙伴在选择待办提醒工具时&#xff0c;会使用微信中的腾讯待办小程序&#xff0c;在里面逐条记录待办事项、设置定时提醒&#xff0c;然后通过微信接收待办提醒。 不过最近一段时间&#xff0c;使用腾讯待办的用户都发现了“业务关停通知”的弹窗&#xff0c;确实如此…

代码随想录打卡第五十五天|● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

300.最长递增子序列 **题目&#xff1a;**给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0…

高数笔记04:微分方程与多元函数微分学

图源&#xff1a;文心一言 时间比较紧张&#xff0c;仅导图~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图~&#x1f9e9;&#x1f9e9; 参考资料&#xff1a;《高等数学 基础篇》武忠祥 &#x1f9ae;思维导图 &#x1f636;‍&#x1f32b;️思维导图为整…

1.面向对象——继承

继承 子类拥有父类非 private 的属性、方法。 子类可以拥有自己的属性和方法&#xff0c;即子类可以对父类进行扩展。 子类可以用自己的方式实现父类的方法。 提高了类之间的耦合性&#xff08;继承的缺点&#xff0c;耦合度高就会造成代码之间的联系越紧密&#xff0c;代码…