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

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

你可能感兴趣的:(4.java里拷贝问题(Java中将一个对象赋值给另一个同类对象,这两个对象是否指向同一堆内存?))