首页 > 解决方案 > 创建列表深拷贝

问题描述

我正在尝试创建 List 的深层副本,但即使在尝试一切复制原始列表之后,我仍然收到新列表为空的错误 <[]> 。

我不确定我的问题是出在代码的深层复制部分,还是在将元素添加到原始列表时出错了。到目前为止,我所拥有的是:

public class OwnedPiggyBank 
{
    List<Coin> bank;
    private Owner owner;


    public OwnedPiggyBank(Owner owner) 
    {
        this.owner = owner;
        bank = new ArrayList<>();
    }

    public void add(List<Coin> coins) 
    {
        bank.addAll(coins);
    }

    public List<Coin> deepCopy() 
    {
        List<Coin> coins = new ArrayList<>();

        for (Coin c : bank)
        {
            coins.add(new Coin(c));
        }

        return coins;
    }

...与此相关的测试用例是:

public void test() 
{
    OwnedPiggyBank b = new OwnedPiggyBank("Lola");
    List<Coin> coins = new ArrayList<Coin>(Arrays.asList(Coin.PENNY, Coin.LOONIE, Coin.TOONIE));
    b.add(coins);
    OwnedPiggyBank c = new OwnedPiggyBank(b);
    assertEquals(coins, c.deepCopy());
}

标签: javalist

解决方案


在你的构造函数public OwnedPiggyBank(Owner owner)中,你有

bank = new ArrayList<>();

所以当然deepCopy bankempty

assertEquals(coins, b.deepCopy());

更有意义

如果你想保留这个test案例,那么你需要做一些类似的事情

public OwnedPiggyBank(OwnedPiggyBank owner) 
{
    this.owner = owner;
    bank = owner.deepCopy();
}

推荐阅读