使用Java中的构造函数进行深层复制

时间:2013-04-12 02:50:11

标签: java arraylist deep-copy

我正在使用这些方法:     一个构造函数,public ProgrammingTeam(ProgrammingTeam p),它需要一个 ProgrammingTeam p作为参数并构造p的深层副本。不要只写meet = p.meets ;.要进行深层复制,必须调用ArrayList的复制构造函数:meets = new 的ArrayList();

  public ProgrammingTeam( ProgrammingTeam p ) {
    teamName = p.teamName;
    teamMembers = new String [ p.teamMembers.length ];
    for (int i = p.teamMembers.length - 1; i >= 0; i--) {

    }
    meets = new ArrayList < Competition >();
}

我无法弄清楚我应该如何撰写,然后完成深层复制。我知道它需要一个for循环来实际复制每个对象,但我不知所措,谢谢!

3 个答案:

答案 0 :(得分:2)

关于String数组......

字符串是不可变的,因此只需复制数组就足够了,例如使用Arrays.copyOf()实用程序方法:

teamMembers = Arrays.copyOf( p.teamMembers, p.teamMembers.length );

至于名单,这取决于......

如果Competitionimmutable,请使用ArrayList的复制构造函数:

meets = new ArrayList<Competition>(p.meets);

如果Competition是可变的,则需要调用其复制构造函数(如果需要,可以定义它)。

meets = new ArrayList<Competition>();
for (Competition c : p.meets) {
    meets.add(new Competition(c));
}

答案 1 :(得分:0)

您需要创建所有ProgrammingTeam参数p的属性的深层副本。

您可以执行以下操作:

for(int i = 0; i < p.teamMembers.length -1; i++){
        TeamMember teamMember = new TeamMember();
        // set attributes
        teamMember.setAttribute1(p.teamMembers[i].getAttribute1());
        ...
        teamMember.setAttributeN(p.teamMembers[i].getAttributeN());
         this.teamMembers[i] = teamMember;
 }

当然,您可以简单地为需要深度复制的列表中的任何对象创建一个复制构造函数。复制构造函数基本上需要完成我在for循环中描述的相同类型的东西。

答案 2 :(得分:0)

制作String[] teamMembers使用java.util.Arrays.copyOf(teamMembers, teamMembers.length)

的深层副本

至于List<Competition> meets的深层副本,您可以使用new ArrayList<Competition>(meets)执行此操作,但只有在竞争不可变时才会有效