Java中将对象加入集合,实质是加入对象的引用的复制

Java对象及集合的高效复制技术实践 在软件开发领域,对象复制是构建复杂应用时常见的需求。对象复制指的是创建一个与原始对象在状态上完全相同的新对象,但不影响原始对象。这种操作在很多场景下都有应用,比如数据传输、数据备份、状态传递等。对象复制主要分为浅拷贝和深拷贝两种类型。浅拷贝只复制对象的引用,而不复制引用的对象本身;深拷贝则递归复制对象的所有成员变量,创建对象的完全独立副本。正确理解这两种拷贝的区别对于编写高效、稳定的代码至关重要。在实际编程中,掌握对象复制的方法能够帮助开发者避免一些常见的问题,如内存泄漏和数据不一致等。 阅读详情
在Java中,我们经常使用封装好的集合框架(如List),下面看一个例子。
import java.util.*;

public class Test {
    public static void main(String[] args) {
        List<Date> list = new ArrayList<Date>();
        Date date = new Date();
        date.setTime(10000);
        System.out.println(date.toString());//打印
        list.add(date);//将设置过的Date类对象date添加入list集合
        date.setTime(30000);//重新设置date对象的时间属性
        System.out.println(list.get(0).toString());//打印
    }
}
结果是这样的:

这说明了一个问题,虽然我们把date对象加入进了list集合,之后再更改list内的时间属性,但是再打印list对象内的date属性的时间值,发现变化了。

其实,我们add入list集合的是date对象的引用的复制品,而不是date对象本身,date对象本身在虚拟机内只存在一份,引用和引用复制品指向的都是同一个date对象,所以通过一个引用更改date对象的属性,是可以导致引用复制品指向的对象属性也变化的。

但是,注意了,如果我们这样做来代替重新setTime:

date = new Date();
集合list中的date是不会变的,因为这使得date引用了一个新的Date类对象,不会影响list中的复制品。

这与java方法传参的原理是一样的。

下面看一副能帮助理解的图:

【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧! 通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性 阅读详情

相关推荐

微信小程序 实现拼图功能

微信小程序 实现碎片拼图

weixin_45689786的博客 2250

关于java循环向list中add对象却对象都是同一个

while(rs.next()) { mes = new message();//如果不加这个的话那么list中的所有对象就都是相同的了。 mes.setMessageId(rs.getString("MessageId")); mes.setTid(rs.getString("Tid")); mes.setSid(rs.getString("Sid")); mes.setStuquestion(rs.getString("Stuquestion")); ...

u013345179的博客 2473

工业异常检测评价指标(I-AUROC、PRO等)

模型评价指标:TPR、FPR、Recall、ROC、AUC、AUROC、IoU、PRO、AUPRO等

qq_1532145264的博客 7431

添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?

问题:添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?   答:对象的引用。以下代码可以证明: Java代码   import java.util.ArrayList;   import java.util.List;      public class Test5 {       public static void main(St

Alex_zhuang的专栏 9132

科研党必备:5分钟搞定Arxiv论文批量导入NoteExpress(附PDF自动下载技巧)

本文为科研人员提供了一套高效的自动化工作流,实现从Arxiv批量检索论文、自动下载PDF到无缝导入NoteExpress的全过程。通过Python脚本和NASA ADS等工具,可大幅提升文献管理效率,特别适合需要追踪前沿动态的研究生和科研团队。

orange的博客 398

VINS-Fusion实战:从零搭建无人机视觉惯性导航系统(附ROS配置指南)

本文提供了一份详尽的VINS-Fusion实战指南,涵盖从硬件选型、传感器标定到ROS节点配置与参数调优的全过程。重点解析了如何将VINS-Fusion视觉惯性里程计系统与PX4飞控深度集成,并实现室外GPS融合,旨在帮助开发者从零搭建稳定、高精度的无人机视觉惯性导航系统。

lll78的博客 864

java中 集合里存放的是对象的引用还是对象实例?

添加一个对象到集合中时,集合里面存放的是对象的引用 既然存放的还是引用,那么涉及到一个问题,也就是说,当改变存放的这个对象实例的原本的值,这个集合内的数据也会改变。 import java.util.ArrayList; import java.util.List; public class Test5 { public static void main(String args[]){ List<User> userList1 =

jj89929665的博客 888

Hive数据仓库分层架构实战:4层黄金模型×6大业务场景×万亿级数据优化方案

根据《2023数据中台成熟度报告》,‌78%的ETL任务性能瓶颈‌源于分层设计不合理。本文基于某头部电商平台PB级数据仓库建设经验,结合金融风控、用户画像、实时大屏等核心场景,深度解析‌ODS→DWD→DWS→ADS‌四层架构设计原则,揭秘‌万亿级数据治理方案‌与‌维度建模20大避坑策略‌。

优快云博客专家,领域包括但不限于:AI、大数据、Python、架构师,有合作、课程、问题、疑惑请私信博主 1483

java问题 将一个对象加入集合,对象变了,集合中的对应的对象也是会改变的吧?

今天犯了一个错误❌,就是我以为把对象放在map里,然后再对对象进行操作是无用的,其实我错了。Java中的对象变量 其实就中一个指针,他指向对象的首地址,map中key对应的其实是某个对象的首地址,指向的是某个对象,你往对象中加了数据,对象的内容变了,但是对象的首地址没有变,map中的key仍然指向的是这个对象的首地址。例子:import java.util.HashMap; import java...

u012045045的博客 5078

使用在UE5中使用AirSim插件Eigen库头文件引用报错,出现报错的解决方式

如图所示,用红线圈出的两条头文件引用会报错,提示无法找到他们,但是可以发现的是,他们的路径书写是没有问题的。在终端中运行时候,会出现如下的报错。

GFCLJY的博客 1006

innovus:insert Power Switch失败,报告not covered by a row问题解析

这个问题就是switch找不到可以放置的row,分析就从两方面入手,一方面从voltage area下手,一方面从row和site入手。检查发现voltage area设置正确,row也存在,只不过lef里缺少对应switch的双倍高的site。更多学习内容请关注「拾陆楼」知识星球。

m0_61544122的博客 1159

对象添加到集合之后再修改对象,会发生什么

把对象添加到集合中,然后再修改对象,会发生什么呢? 下面分别看一下修改对象属性值和修改对象引用后的效果。 案例一,修改对象属性值 创建几个对象,添加到List中,然后修改对象的属性值,那么List中的元素的属性值会随之改变,比如下面的例子: public static void test1() { List<Order> list = new ArrayList<>(); for (int i = 0; i < 3; i++) { .

lkforce 7597

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java集合对象的深度复制与普通复制

最近在开发中遇到了一些关于集合复制的一些问题,普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域。所以当拷贝的集合修改了集合对象内的数据,那么源集合对象也就随之改变了,这样的效果我们称之为Java集合对象的浅复制,即只是在栈中拷贝了,而堆中的数据并没有拷贝。

Anderson 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java如何复制对象

假如说你想复制一个简单变量。很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象,情况就有些复杂了。 假设说我是一个beginner,我会这样写: c

Benson的专栏 7万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java引用类型对象地址引用和内容复制

Java数组属于引用类型对象,以此为例说明地址引用和内容复制的区别 1.地址引用 为一个数组变量赋值另一个数组变量后,2个数组变量指向同一个内存地址,引用同一个数组对象,此时内存中并没有建立新的数组对象。 2.内容复制 有时候需要复制一个数组或数组的一部分,在内存中独立于原数组对象存在,即创建一个新数组对象。 复制一个新数组对象主要有3种方法 1)使用循环语句逐个地复制所有或部分数组元素 2)使用...

沧海桑田的博客 2996

java中怎么复制集合_Java中List集合间的复制

Java中List集合间的复制一、概览在这篇短文中,我们将向你展示把一个List复制到另一个List中去的不同方式以及在这个过程中常见的错误。二、构造器copy一个List最简单方式就是使用构造器,这个构造器能接收一个集合参数。List copy = new ArrayList<>(list);由于使用这种方式的内部机制是:复制对象的引用而不是clone对象,所以对对象的每一个修改都将...

weixin_39651325的博客 1万+

Java 列表复制与对象引用

在 Java 中,当使用 List<School> 这样的集合存储对象时,实际上存储的是对象的引用,而不是对象本身。也就是说,集合中的元素指向了堆内存中实际的对象实例。

hello77的blogggg 祝你得偿所愿 1043

Java对象的复制四种方式

Java架构进阶面试及知识点文档笔记这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理Java分布式高级面试问题解析文档其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!互联网Java程序员面试必备问题解析及文档学习笔记Java架构进阶视频解析合集《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

2401_84411776的博客 4251

JAVA复制对象和集合的工具类

JAVA复制对象和集合的工具类 因为BeanUtils.copyProperties(Object source, Object target),只能复制对象,不能复制数组和集合,所以决定写个工具类来解决 public class CopyUtils { /** * 复制对象 */ public static <T,K> T convert(K s...

qq_39172525的博客 1512

Java复制对象与集合工具类

项目中经常需要将某个对象的属性值复制给另一个对象,或者将一个集合复制到另一个集合。利用spring提供的BeanUtils,自己简单封装了一个工具类。 public class CopyUtils { /** * 复制集合 */ public static <T,K> List<T> copyList(List<K> sou...

qq_38827420的博客 3416

java 对象复制 集合复制工具类

<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.6.6</version> </dependency> <dependency> ...

忧郁天空 5191

java 对象复制字段_Java 对象复制

Java 对象的一共有 3 种复制对象的方式。1.直接赋值 (引用复制 ),此种复制方式比较常用。诸如 A a = b ; a 是直接复制了b的引用 ,也就是说它俩指向的是同一个对象。 此时 a == b [ true ] 。1 classA{2 privateString string;3 A(){string = new String("original state");...

weixin_31442209的博客 895

java 复制引用,Java面试 - 复制引用和复制对象的区别?

复制引用:把原对象的地址赋给了一个新的引用变量,只要其中一个对象的属性发生变化,另一个对象的属性也随之发生变化。复制对象:把原对象的内容赋给了一个新的对象,其中一个对象的属性发生变化,并不影响另一个对象的属性。举例:被复制对象为Student s1,复制的新对象为Student s2复制引用:Student s1 = new Student("Jack");//把对象s1赋给对象s2Student...

weixin_31162865的博客 270
上一篇: 78. Subsets 【LeetCode算法之旅之深度优先搜索】
下一篇: Leetcode上和DFS有关题目整理 (内含目录)
LiQiyaoo
博客等级 码龄11年 337粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值