【问题标题】:Shallow copy for arraylist数组列表的浅拷贝
【发布时间】:2021-11-26 23:32:07
【问题描述】:

嗨,我正在使用 clone() 方法来复制我的数组列表的引用,像这样

import java.util.*;

public class Cloning {
public static void main(String[] args) {
ArrayList v = new ArrayList();
for(int i = 0; i < 10; i++ )
v.add(new Int(i));
System.out.println("v: " + v);
ArrayList v2 = (ArrayList)v.clone();
for(int i=0;i<v2.size();i++ )
((Int)v2.get(i)).increment();
System.out.println("v: " + v);
}
} 

输出是

v: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
v: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

否则如果我做这个

import java.util.*;

public class Cloning {
public static void main(String[] args) {
ArrayList v = new ArrayList();
for(int i = 0; i < 10; i++ )
v.add(new Int(i));
System.out.println("v: " + v);
ArrayList v2 = v;
for(int i=0;i<v2.size();i++ )
((Int)v2.get(i)).increment();
System.out.println("v: " + v);
}
} 

输出是一样的。所以我的问题是,如果我对 arraylist 使用 clone() 方法,或者我使用 ArrayList v2 = v;是一样的吗?

【问题讨论】:

    标签: java class arraylist copy shallow-copy


    【解决方案1】:

    输出是一样的。所以我的问题是,如果我对 arraylist 使用 clone() 方法,或者我使用 ArrayList v2 = v;是一样的吗?

    不是:

    List<String> a = new ArrayList<String>();
    List<String> b = makeCopy(a);
    a.add("Hello");
    System.out.println(b);
    

    如果makeCopy 为:

    public List<String> makeCopy(List<String> in) {
        return new ArrayList<String>(in); // or .clone(), same thing.
    }
    

    但如果 makeCopy 只是 return in;(相当于 List&lt;String&gt; b = a;),它将打印 [Hello]

    这不是组件 - 那些没有被克隆(因此,“浅”)。它是列表本身。实际克隆意味着有 2 个列表对象,因此您可以修改一个列表而不修改另一个列表。列表对象只包含引用(指针),浅克隆列表不会克隆这些对象。

    使用List&lt;String&gt; b = a,您只有两个对单个列表的引用。鉴于只有一个列表,如果您修改列表(a.add()b.add(),好吧,只有一个列表,所以,这就是您要更改的列表,并且 a 和 b 同样反映了更改:

    b = a;
    System.out.println(a.size()); // prints 1
    b.add("Goodbye");
    System.out.println(a.size()); // prints 2
    

    a 保留大小为 1 的列表?这需要克隆列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 2021-04-20
      相关资源
      最近更新 更多