java对象赋值给另一个_4.java里拷贝问题(Java中将一个对象赋值给另一个同类对象,这两个对象是否指向同一堆内存?)...

本文探讨了Java中对象赋值时的内存引用问题,解释了值传递和引用传递的区别。通过示例代码展示了如何在链表中更新节点信息,并讨论了深拷贝与浅拷贝的概念。当直接赋值一个对象给另一个对象时,实际上是共享同一堆内存,导致修改一个对象会影响到另一个。为避免这种影响,需要使用克隆或深拷贝方法。
摘要由CSDN通过智能技术生成

Java中将一个对象赋值给另一个同类对象,这两个对象是否指向同一堆内存?

这些都是个问题,最先我都只是大概了解,没有深究,后来也写过一点。1.2发散了一下,java究竟是值传递还是引用传递?

最终发现这个问题是在算法与数据结构里的知识,关于单链表,详情请看算法数据结构里单链表的文章。

//修改节点的信息,根据no修改,即no不能改变

//根据新的节点 no修改

public void update(HeroNode newHeroNode){

//判断是否为空

if (head.next == null){

System.out.println("链表为空:");

return;

}

//定义一个辅助变量

HeroNode temp = head.next;

boolean flag = false;//表示是否找到该节点

while (true){

if (temp == null){

break;//遍历完

}

if (temp.no == newHeroNode.no){

//找到

flag = true;

break;

}

temp = temp.next;

}

//根据flag判断是否要修改的节点

if (flag){

temp.name = newHeroNode.name;

temp.nickName = newHeroNode.nickName;

}else {

System.out.println("未找到该节点"+newHeroNode.no);

}

}

这里有一个问题困扰了我很久,我想了很久,久的想的脑袋痛。

就是这个temp变量,其他都没什么,为什么修改方法里临时变量的值就修改了相应heronode的值?

我最先的理解

int b=33;

int c=b;

b++;

System.out.println(b);

System.out.println(c);

结果是34,33

public class SingleLinkedListDemo {

public static void main(String[] args) {

test a=new test(33);

test b=a;

System.out.println(a.no);

a.no++;

System.out.println(a.no);

System.out.println(b.no);

test c=new test(36);

test d=c;

test e=new test(3);

d=e;

e.no++;

System.out.println("-----------------");

System.out.println(c.no);

System.out.println(d.no);

System.out.println(e.no);

}}

class test{

public int no;

public test(int no) {

super();

this.no = no;

}

public int getNo() {

return no;

}

public void setNo(int no) {

this.no = no;

}

}

答案是

33

34

34

-----------------

36

4

4

由上面的案列可以看出,对于对象的话,修改了a,b也就自动变了值,即使没有对b有任何操作。

当你对对象进行操作,不管是赋值之前还是之后,两个值都会修改,这是因为它们是指向同一个对象,指针不一样。

所以这就涉及深拷贝与浅拷贝,深拷贝就是复制一个对象到一个全新的对象,和之前的对象没有关联;

浅拷贝就是前面提到的直接赋值给另一个对象。

如果想实现深拷贝,就需要自己去实现,比如

通过deepClone()进行深拷贝

上面这段话引用于

看了其他文章,也有详细描述

让一个对象=另一个对象,修改一个对象的值,如何不影响另一个的值

我有一个自己作的class(LinkedStack),然后声明了两个对象LinkedStack temp = new LinkedStack();LinkedStack Path。

但是,当我用temp = Path;把path的值给了temp以后;我对temp进行一些删除,但是path里面的值也没了。

请问如何把path的值赋给temp,但是修改temp的时候不影响path。

答案:定义的每一个类都是引用类型,当一个实例复制给另一个实例的时候,就是你的temp=path,实际上是把path所指向的内存地址空间传递给了temp,所以当temp进行操作改变的时候,path也就发生了改变,因为两个变量好比一个房间的两把钥匙,无论谁用钥匙进去改变了房间中的物品,然后用另外一把钥匙进去看到的肯定是改变后的房间。

所以,对于引用类型,就要使用克隆赋值,即temp=path.clone();它标志着按照path所指向的地址房间,重新建造了一个一模一样的房间,并把钥匙给了temp。假设原来的path所指向的地址是1000000,那么temp就可能为1010000了。

不知道我这个解释你能不能明白。其实上面几位都解释得很正确了。

以下哪种JAVA的变量表达式使得变量a和变量b具有相同的内存引用地址( )

String a = "hello"; String b = "hello";

Integer a; Integer b = a;

int a = 1; Integer b = new Integer(1);

int a = 1; Integer b = 1;

A B

内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。

int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法

==

A对 指向常量池里的"hello"。

B对

选项 Integer a 应该初始化。如果Integer a和b都是全局变量就是正确的,如果是局部变量就是错误的,因为需要初始化

int和任意Integer都是同一地址

Integer只在127范围内才是同地址,超出就false

integer()与Integer,Integer()无论什么数范围 都不同地址

C错 int a =1;并不指向堆中,它只有值,没有引用地址,Integer b =new Integer(1);指向堆中地址为1的位置。

D错 原因同C

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值