当前位置: 首页 > 知识库问答 >
问题:

列表中的复制构造函数在Java中是浅复制还是深复制?[副本]

闻人飞白
2023-03-14

有人告诉我构造函数复制是一种浅层复制方法。

        List<Integer> ints = new LinkedList<>();

        ints.add(1);ints.add(2);ints.add(3);ints.add(4);ints.add(5);



        List<Integer> intsCopy = new LinkedList<>(ints); //Shallow Copy
        
        ints.set(0,31);

        ints.forEach(x -> System.out.print(x + " "));
        System.out.println();
        intsCopy.forEach(x -> System.out.print(x + " "));
        System.out.println();

通常情况下,如果我修改了List ints的第一个元素,那么List intscope中的相应元素应该已经修改为31了,对吗?因为变量intscope和ints引用了同一个对象,但我得到了这个输出。

31 2 3 4 5 
1 2 3 4 5 

举个例子,我的意思是:

        int[] arr = {1,2,3,4,5};
        int[] arr2 = arr;
        arr[0] = 10;
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(arr2));

我得到这样的输出:

[10, 2, 3, 4, 5]
[10, 2, 3, 4, 5]

因为变量arr和arr2引用了同一个对象。如果我修改了数组中的一个元素,那么其他元素也会产生影响。当我使用列表进行构造函数复制时,这不是同样的情况吗?

共有1个答案

凤修为
2023-03-14

不是同样的情况。

在第二段代码中,您实际上引用了相同的内存中对象。因此,来自一个引用的更改将被另一个引用看到。

在第一种情况下,您正在构建一个由IntScope引用的全新对象,该对象碰巧存储了相同的整数值,但是,从一个引用所做的更改对另一个引用是不可见的,因为本质上有两个对两个不同对象的不同引用。

 类似资料:
  • 问题内容: 我需要制作一个副本,`HashMap<Integer, List List List `原件中。 如果我正确理解,这两种方法只会创建浅拷贝,这不是我想要的: 我对吗? 除了遍历所有键和所有列表项并手动复制之外,还有更好的方法吗? 问题答案: 没错,浅表副本不能满足您的要求。它将具有原始地图中的副本,但这些副本将引用相同的对象,因此对from 的修改将出现在from的对应内容中。 在Ja

  • 问题内容: python中是否有复制构造函数?如果没有,我将怎么做才能达到类似的目的? 情况是,我正在使用一个库,并且在其中扩展了其中一个类,并提供了额外的功能,我希望能够将从库中获得的对象转换为自己的类的实例。 问题答案: 我想你想要复制模块 您可以像控制泡菜一样控制复印。

  • 上面引号中加粗的表示对复制构造函数的调用是显式的,对吗?是G++错了还是我对标准的解释错了?

  • 问题内容: 我想在BaseClass构造函数中复制SubClass对象。我需要以下代码正确执行。 可能吗?如果可以,我该怎么办?其他如何获得类似的效果? 问题答案: 这是不可能的。类A的构造函数为您提供了A的实例,无法绕开它。为什么不显式实例化子类? 另一种可能性可能涉及静态工厂方法,例如:

  • 本文向大家介绍浅谈Javascript中深复制,包括了浅谈Javascript中深复制的使用技巧和注意事项,需要的朋友参考一下 在javascript中,所有的object变量之间的赋值都是传地址的,可能有同学会问哪些是object对象。举例子来说明可能会比较好: 所以其实我们深复制主要需要处理的对象就是object对象,非object对象只要直接正常的赋值就好。我实现js深复制的思路就是: 遍历

  • 问题内容: 您能告诉我Java克隆是什么意思吗?什么是深层复制和浅层复制,请举例说明 问题答案: 我强烈建议阅读有效的Java第二版中的第11项