List的add方法隐藏的坑

Java List.remove()方法深度解析:从原理到实战避坑指南 在Java集合框架中,List接口的remove()方法是操作列表数据的核心方法之一,它涉及数据结构基础与算法复杂度分析。其原理基于底层实现(如ArrayList的数组移位和LinkedList的节点指针修改),在删除元素时需考虑时间复杂度与内存操作效率。该技术的价值在于帮助开发者编写高性能、可维护的代码,避免常见的并发修改异常(ConcurrentModificationException)和性能陷阱。应用场景广泛,包括数据清洗、条件过滤、以及在处理如list parameter is not prese 阅读详情

在一个List中add()了一个对象后,之后再没有改变这个List,某个时间点取出List中的数据, 却发现取出的数据已经发生了变化。

这个bug排查了好久,才发现是因为当初add的对象在别的类中被改变了!

这就是List的add方法隐藏的坑,且当原对象不在一个类中时,bug原因不容易被发现。

原来当我们调用add()或addAll()方法时,添加的是引用,当原对象改变时,list中的数据会相应改变。

来看这个示例:

 class People {
     String name;
 }
 List<People> peoples = new ArrayList<>();
 People p = new People();
 p.name = "Sbingo";
 peoples.add(p);
 System.out.print(peoples.get(0).name + "\n");
 p.name = "Sbingo changed";
 System.out.print(peoples.get(0).name + "\n");

执行后输出:

Sbingo
Sbingo changed

可见改变对象p后,peoples 中的数据确实发生了变化!

But!!!
这对String、int等元类型数据不是一回事。
看以下示例:

List<String> list = new ArrayList<>();
String a = "string a";
list.add(a);
System.out.print(list.get(0) + "\n");
a = "a changed";
System.out.print(list.get(0) + "\n");
List<Integer> list1 = new ArrayList<>();
int b = 1;
list1.add(b);
System.out.print(list1.get(0) + "\n");
b = 2;
System.out.print(list1.get(0) + "\n");

执行后输出:

string a
string a
1
1

可见,变量a、b的改变并没有影响list、list1 中的数据。

stackoverflow上也有相关的问答:
https://stackoverflow.com/questions/7080546/add-an-object-to-an-arraylist-and-modify-it-later

Linux 隐藏进程 这种方式属于DKoM(Direct Kernel Object Manipulation)攻击方式了,即直接内核对象操作技术。关于第一种hook方式可以参考上一篇文章。最后推荐一个rootkit工具。 阅读详情

相关推荐

STM32F103C8T6+A4988驱动42步进电机全流程(附接线图+代码解析)

本文详细介绍了使用STM32F103C8T6单片机与A4988驱动模块控制42步进电机的完整流程。内容涵盖硬件接线图解析、电流设置、GPIO驱动代码编写以及细分控制等核心实践,旨在帮助嵌入式开发者和DIY爱好者快速实现精准运动控制,适用于3D打印机、CNC等需要精密定位的项目。

Python的专栏 794

ArrayList.add()方法结果把之前的值给覆盖了

ArrayList.add()方法结果把之前的值给覆盖了解决办法

Snowclear_的博客 1989

Warning-[INFL_DELTA] Too many events zero delay loop

项目场景: 运用VCS工具执行仿真的时候,遇到如下错误提示,但仿真还在继续。 Warning-[INFL_DELTA] Too many events Possible zero delay loop. Too many events in the simulation at time 0 fs. 问题描述: 为什么会有这个问题; 什么导致了这个问题; 原因分析: 1、为什么会有这个问题 由于竞争条件或编码风格不明确,可能会产生零延时回路,导致仿真挂起或仿真时间无限。 2、什么导致了这个问题 举

hh199203的博客 1万+

java中List的add方法添加对象时都是最后的一条记录,且该对象改变时,list中的内容也会跟着该对象改变

list中添加对象 import java.util.ArrayList; import java.util.List; public class ListTest{ public static void main(String [] args) { Cat cat1=new Cat("hello"); Cat cat2=new Cat("java"); Cat cat3=new Cat("world"); List<

qq_27346503的博客 1388

语义通信高斯信道仿真代码

【代码】语义通信高斯信道仿真代码。

一去不复返的通信er 427

基于DFT的mbist sdc模板(DFT)

摘要:本文详细介绍了DFT测试模式下的SDC约束方法。

murphyrong的博客 921

List add,改变原有数据

问题:for循环往list添加数据,最开始的数据被修改 解析:子集被更改 解决:需要在for中new新的子集,再一次往list中添加。避免list.add(info)后去修改原有的info。 原始代码 List<Info> list = new ArrayList<Info>(); List<Entity> entitys = new ArrayList<Entity>(); Entity entity = new Entity(); enti.

ahjujian的博客 1904

YOLOv8自动驾驶系统 —— 夜间低光照条件 详细说明和完整代码

本文提出一种针对夜间低光照优化的自动驾驶车道保持系统方案,基于YOLOv8模型改进,包含三大核心技术:1.采用Retinex理论的多尺度低光增强算法,结合自适应伽马校正;2.改进YOLOv8的车道检测模型,通过夜间专用数据集训练,增加抗眩光处理;3.多传感器融合框架,整合可见光与红外图像。系统实现动态逆透视变换和参数调整,在Jetson Orin硬件上达到30ms级实时性能。测试显示在无照明、眩光干扰等极端场景下保持稳定,代码已开源。扩展方向包括V2X协同定位和自适应大灯联动控制。

u010117029的博客 598

解决List的add方法错使前面的元素被覆盖成相同值

今天数据结构讲到栈和队列,无意中灵感突发,想到了给之前开发的2048小游戏加一个反悔的功能,并且可以反悔任意多步数(内存允许的情况下)。 反悔其实就类似于编辑类软件的撤销功能,不过这个撤销队列在数据操作上有自己的特征。

倚竹幽篁 8600

PyTorch 最新安装教程(2021-07-27)

PyTorch 最新安装教程(2021-07-27)前言1. 安装 Anaconda2. 检查显卡,更新驱动3. 创建PyTorch环境4. 配置清华TUNA镜像源5. 安装 PyTorch6. 测试 前言 万事开头难! 这句话又一次被我验证。 记得前不久刚陷入Tensorflow2.0的安装困境,这一次又被PyTorch 搞哭辽。 孩子太难了o(╥﹏╥)o,不过还好最终成功安装,感谢全网资源,感谢大佬们的博客!被我一次一次试了出来。 1. 安装 Anaconda Anaconda 是一个用于科学计算的 P

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 23万+

metahuman 下载材质 脸部灰白 脸部过亮

metahuman 下载材质 脸部灰白 脸部过亮

jacke121的专栏 243

List集合add方法覆盖原来的内容解决办法

今天遇到一个有意思的问题,当我遍历数组的同时在for循环中使用list.add(),但这样会将之前的内容也覆盖掉。本来有3条数据,但这样会得到三条相同的数据 解决办法:   在循环中将你的对象再new一次 原因:   当使用List时,如果T是引用类型,保存的是引用,如果是值类型,保存的是值本身。 1、T是对象是,也就是说如果是引类型时,在循环外边已经new了一个对象,相当于这个对象的地

qq_1599450803的博客 2万+

Google Earth Engine(GEE)——将sentinel - 2影像所有波段重采样到10m分辨率 (resample 和 projection的使用)

影像重投影是将一个影像从一个坐标系投影到另一个坐标系的过程。这通常涉及到将像素从一个平面坐标系变换到另一个平面坐标系。这可以用于许多应用中,例如建立数字高程模型(DEM)和地图制图。影像重投影通常需要进行数学计算,包括转换矩阵和插值算法,以确保像素值的准确性和精度。这次我们将对哨兵2好数据中20m分辨率的波段,重采样到10m分辨率中,然后同一参与计算。

此星光明博客 3108

java中的add()_java中list.add()方法中的小细节

list.add()中的小细节最近在码代码的时候发现一个有趣的list问题,就是list中的add()方法和list中的add()方法会有点区别。前者是和预想的一样,就是给集合按顺序添加元素,而后者在添加的时候会覆盖前面的元素。例如:listpublic static void main(String[] args){List list = new ArrayList();list.add("第一...

weixin_39639260的博客 966

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

List集合中隐藏的坑

List是Java 中常用的集合类之一,几乎所有的代码都离不开List,但是List在使用过程中存在一些隐藏的问题。 ArrayList插入失败? Intiger[] array = {1,2,3}; List<Integer> list = Arrays.asList(arrays); list.add(4); 这段代码看起来没什么问题,将数组转化为集合然后进行添加操作,然而在运行过程中add操作会出现UnsupportedOperationException; asList不是也返回了一

weixin_47236538的博客 284

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java中的add()_java中add方法

java中Calendar类方法详解_计算机软件及应用_IT/计算机_专业资料。abstract void add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的......JAVA:事件监听器之 Button 类中的 addActionListener(ActionListener l)方法 addActionListener public voi...

weixin_30691643的博客 7101

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

开发中遇到的坑——用Arrays.asList将数组转成list,调用用add()方法报错Exception in thread “main“ java.lang.UnsupportedOperati

最近项目中遇到了一个坑,项目启动没问题,一直正常运行,有一次报了莫名其妙的错误: Exception in thread “main” java.lang.UnsupportedOperationException at java.base/java.util.AbstractList.add(AbstractList.java:153) at java.base/java.util.AbstractList.add(AbstractList.java:111) at arraylist.Test.main

samur2的博客 444

pixi workspace environment 命令完全指南:用 add / list / remove 管理多环境工作区

`pixi workspace environment` 是 pixi 中负责管理工作区(workspace)环境的命令组,它把分散在多个 feature 中的依赖、平台与任务组合成一个个可独立锁定(lock)与安装(install)的环境。本指南将完整讲解该命令组的用法、全部参数与选项,并结合仓库源码说明其底层实现,读完你可以在 `pixi.toml` / `pyproject.toml` 中熟

gitblog_01184的博客 946

Linux 进程隐藏之摘链隐藏

0x01:先说说一般进程隐藏的常见方式 0x02:

qq_42931917的博客 6789

通过一个list集合控制一个activity中所有的fragment显示与隐藏

public void switchFragment(int targetIndex) { List&lt;BaseFragment&gt; list = getListFragment(); if (list != null &amp;&amp; list.size() &gt; 0) { FragmentTran...

qq_26782663的博客 878

SharePoint 隐藏Add New Item

SharePoint List和Document上都有Add New Item 隐藏这个按钮有两个办法 1.通过权限设置隐藏,设置后要有权限的用户才可以看到 2.通过css样式隐藏 ,如下: td.ms-addnew { display:none; } 写一个WebPart然后将WebPart加进一个页面里面,这个页面的Add New Item就会被隐藏了,而且对其他页面没

a550585206的专栏 749

Buildah manifest add 完全指南:向 manifest list 与 image index 添加镜像与 OCI artifact

`buildah manifest add` 是 Buildah 多架构镜像工作流中的核心命令,负责把单个镜像、整个多架构列表乃至任意文件(artifact)写入本地的 manifest list 或 OCI image index。本文以官方手册 [docs/buildah-manifest-add.1.md](https://link.gitcode.com/i/b3a32b154b53cc8

gitblog_00631的博客 152

list删除_java循环删除ArrayList中的元素和隐藏的坑

一.如何正确删除?1.JDK 1.8的方法引用方式public class Test { public static void main(String[] args) { List<String> list= new ArrayList<>(); list.add("张三"); list.add("李四"); ...

weixin_39630813的博客 225

How to: Add and Customize the Ribbon Skin List and Skin Gallery

皮肤列表和皮肤库允许用户选择皮肤。本文介绍如何在功能区中显示“皮肤列表”或“皮肤库”并对其进行自定义。

龙七 781

SharePoint Powershell 隐藏List下的Content Type之后 界面操作visible属性失效问题

最近在SharePoint powershell的测试的时候遇到一个问题,调用powershell基本如下 $List = $Web.GetList($Url) $ctlist=New-Object System.Collections.Generic.List[Microsoft.SharePoint.SPContentType] #$List.RootFolder....

ave-mike的专栏 315

Java List深度解析:ArrayList与LinkedList源码、扩容机制及面试避坑指南

在Java集合框架中,List是最核心的有序、可重复且支持下标访问的接口之一。理解其实现类ArrayList、LinkedList与Vector的底层数据结构,是掌握集合性能优化与安全用法的关键。ArrayList基于动态数组实现,随机访问O(1),扩容时按1.5倍增长,而LinkedList采用双向链表,头尾操作高效,但随机访问成本较高。快速失败机制和modCount字段决定了遍历时删除元素的安全方式。面对并发场景,CopyOnWriteArrayList提供读多写少的无锁方案,而Collections.

weixin_33858336的博客 343
上一篇: 神奇的Python装饰器
下一篇: Bitmap转为单色位图,打印电子签名
binaryshao
博客等级 码龄11年 52粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值