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

Java浅Copy的一些事

最近发现了一个现象:用BeanUtils.copyProperties(Object source, Object target)时, 如果source和target中有List对象,然后修改了source的List对象中的元素,发现target的List对象也会跟着变化。

调研了BeanUtils.copyProperties(Object source, Object target)源码,发现是通过method.invoke方法来实现属性的copy的,所以对象的属性复制都是浅Copy。


于是乎就换了一个种方式来写:

List<A> source = new ArrayList<>();
source.add(new A());
List<A> copy = new ArrayList<>(source);
复制代码

发现居然还是不行!

觉得很奇怪,然后看了ArrayList的构造方法,

public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
复制代码

elementData = c.toArray() 这段代码还是浅Copy。


思考了一会,难道只能通过遍历元素,然后添加元素的方式来解决吗?抱着疑问去Google了下,发现该函数Collections.copy解决了问题,进入其源码发现是在遍历元素然后再添加。。。

总结

  • copy完之后,一般都是直接返回给调用方了,一般不会再次操作数据,这样就不会引发浅Copy的问题。这也是copy的正确用法。

转载于:https://juejin.im/post/5bee8ddde51d454eee66dd02

相关文章:

  • Java Log4j 配置文件
  • C++ 编译器
  • Haskell写的Parser
  • Java String.getBytes()编码
  • smm架构的优势
  • 不学无数——SpringBoot入门Ⅲ
  • 比特币的暴跌史
  • 微信小程序直播,腾讯云直播+微信小程序实现实时直播
  • POI导出数据以Excel的方式录入,下载
  • 如何实现MetaMask签名授权后DAPP一键登录功能?
  • 双十一流量洪峰 支撑阿里核心业务的云数据库揭秘
  • python编程入门----测试与类编写
  • 项目(八) Jenkins持续集成与构建
  • Dashboard安装配置
  • vue中的slot
  • ES学习笔记(12)--Symbol
  • FastReport在线报表设计器工作原理
  • Java应用性能调优
  • oldjun 检测网站的经验
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 如何学习JavaEE,项目又该如何做?
  • 思考 CSS 架构
  • 为视图添加丝滑的水波纹
  • 消息队列系列二(IOT中消息队列的应用)
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #NOIP 2014# day.2 T2 寻找道路
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (C语言)fgets与fputs函数详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (九十四)函数和二维数组
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)u-boot-nand.bin的下载
  • ****Linux下Mysql的安装和配置
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .chm格式文件如何阅读
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • //解决validator验证插件多个name相同只验证第一的问题
  • /3GB和/USERVA开关
  • [ C++ ] STL---stack与queue
  • [ 数据结构 - C++]红黑树RBTree
  • [20190113]四校联考
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Angular] 笔记 21:@ViewChild
  • [ANT] 项目中应用ANT
  • [C++] Windows中字符串函数的种类
  • [CareerCup] 14.5 Object Reflection 对象反射
  • [ffmpeg] 定制滤波器
  • [FROM COM张]如何解决Nios II SBTE中出现的undefined reference to `xxx'警告
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [HarmonyOS]第一课:从简单的页面开始
  • [HTML]Web前端开发技术28(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页