java - 数组列表的浅拷贝

标签 java arraylist constructor copy

你好,我正在制作一款扑克游戏。我知道这个浅拷贝构造函数是不正确的,但为什么它不正确?

public Deck() {
    cards = new ArrayList <Card>();

    for (int type= 0; type<=4; type++){ 
        for (int value=1; value<9; value++){ 
            Card newCard = new Card (value, type); 
            cards.add(newCard); 
        }
    }

}

public Deck(Deck other) {
    ArrayList<Card> cardsCopy  = cards;

    }   

最佳答案

public Deck(Deck other) {
    ArrayList<Card> cardsCopy  = cards;    
    }   

这里cardsCopyDeck实例无关。它是一个孤立的变量,一旦构造函数执行完毕,它就不再存在。
要获得 other Deck 的浅拷贝,您应该将对 Deck 的引用分配给您正在创建的副本的 cards 字段。来自 other 实例的 >cards 字段。

浅拷贝构造函数可以是:

public Deck(Deck other) {
   cards = other.cards;
}   

但正如您在问题标题中所问的那样,它不是 ArrayList 的浅拷贝,因为原始和副本中的 cards 字段都引用了相同的对象。

要拥有一个带有 ArrayList 浅拷贝的浅拷贝构造函数,您可以这样做:

public Deck(Deck other) {
   cards = new ArrayList<Card>(other.cards);
}   

或者使用ArrayList中定义的clone()方法:

public Deck(Deck other) {
   cards = other.cards.clone();
}  

关于java - 数组列表的浅拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40683670/

相关文章:

java - IText Unicode 印度字符未正确显示

java - 如何在 Linux 中为 OpenNI 编译和运行 java 文件

Java:就地对 ArrayList 进行排序

c - 为什么 __attribute__((constructor)) 在静态库中不起作用?

c++ - 使用 lambda 默认构造的 std::priority_queue

java - 流和实际数据有什么区别?

java - 使用名称创建 bean 时出错 - Grails 2.3.8

JavaFX - 监听列表中的变化

Java地址簿。如何防止代码中出现重复的联系人?

php - 构造函数后直接调用函数 : new Object()->callFunction()