如何将对象数组复制到另一个数组?

时间:2013-06-01 21:43:51

标签: java oop

我在Java中创建一个简单的对象数组,我的代码的一部分是以下

public class Student{
     private String name;
     private double score;
     public Student(String name){
        this.name=name;
        this.score=score
}

public class Classroom{
    private Student[] listStu;
    private int sc;
    public addStu(Student stu){
           listStu[sc]=stu;
           sc++;
    }
    public Student[] getClassroom(){
            return listStu;
    }
    public int getNum(){
           return sc;
    }
    public printList(){
          for (int i=0;i<sc;i++){
              System.out.pritnln(listStu[i].getName());
          }
}

在主课程中我编程:

Classroom c=new Classroom();
Student[] stuList;
int nStu;
Student s1=new Student("michael",3.0);
Student s2=new Student("larry",4.0);
c.addStu(s1);
c.addStu(s2);
stuList=c.getClassroom();
nStu=c.getNum();

问题是当我在主类中修改类stuList的对象时,类似于:

stuList[0].setName("peter");

我看到当我调用printList方法时,我的数组中的数据也被修改了(在我的例子中,“michael”的名称被“peter”更改)。我的问题是如何将我的对象数组复制到主类的stuList中,以便这个数组不会干扰我的原始数据?这个程序真的是必要的,还是不太可能发生这种情况?

由于

5 个答案:

答案 0 :(得分:3)

通常你会使用List<Student>而不是编写自己的集合,但问题是一样的。你有一个浅层的数组副本,你想要一个深层副本。您需要使用包含相同信息的新Student对象创建新数组,而不是引用该数组。

显然这是繁琐而缓慢的,一般建议是避免更改从集合中获取的任何集合(例如数组)。即使用setName是一个坏主意,除非“Michael”将他的名字改为“Peter”。如果你想用彼得取代迈克尔,你就有一个enw学生,那应该取代旧的学生参考。

答案 1 :(得分:1)

Student class:

进行这些更改
class Student implements Cloneable {

    protected Student clone() throws CloneNotSupportedException {
        return (Student) super.clone();
    }

Classroom class:

中添加此方法
public Student[] deepCopy() throws CloneNotSupportedException {
    Student[] deepCopy = new Student[this.listStu.length];
    for (Student student : this.listStu) {
        deepCopy[0] = student.clone();
    }
    return deepCopy;
}

然后使用main方法:

Student[] backupList = c.deepCopy();
backupList[0].setName("test");
System.out.println(backupList[0].getName());
System.out.println(stuList[0].getName());

将输出:

test
michael

此外,您似乎在代码中遇到了一些语法错误:

    public Student(String name){
    this.name=name;
    this.score=score
}

缺少右括号}(方法中的那个),得分不是参数,缺少;

但是,如果您使用此解决方案,请务必记录更多有关cloning in Java

的信息

答案 2 :(得分:0)

在Java中,你使用指针,这就是为什么当你在第二个数组中修改它时,它也会在第一个数组内部进行修改。尝试更改此内容:

public addStu(Student stu){
       listStu[sc]=stu;
       sc++;
}

到此:

public addStu(Student stu){
       listStu[sc]=(Student) stu.clone();
       sc++;
}

看看它是否有效。

答案 3 :(得分:0)

要复制数组,请使用System.arraycopy(参见http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy%28java.lang.Object,%20int,%20java.lang.Object,%20int,%20int%29)。

但请记住:Java中的一个对象数组是对数组元素的引用数组。与克隆集合类似,副本将包含相同的元素。对于您的用例,您必须复制元素本身。

答案 4 :(得分:0)

你可以这么做:

Student newStudent = stuList[0];
newStudent.setName("peter");

现在您有了一个新对象,如果更改它,数组值将不会受到影响。