操纵移动的数组会更改java中的主数组数据

时间:2016-10-19 09:10:01

标签: java

我这样做:

ref

在这里,我收集评论并将它们放入一个集合中,然后放入一个arraylist。然后我用DTO类方法操作注释。

但是当我更改EventHandler<>时,EventArgs的评论会发生变化。

我认为这段代码已足够但如果你愿意,我可以提供更多代码。为什么会改变?它应该不会改变,因为我把它移动到集合然后到阵列?

我不这样做:

 Collection<TaskComment> commentsCollection = task.getComments();
 ArrayList<TaskComment> comments = new ArrayList<>(commentsCollection);

       for(TaskComment cmnt : comments){

                cmnt.setUser(commentUser.getLogin());
                cmnt.setCreatedAtString(cmnt.getCreatedAt().format(DateTimeFormatter.ofPattern(Constants.DATE_TIME_FORMAT)));
            }

我操纵评论后,所以一定不能保存到数据库中?那么为什么呢?

cmnt

返回更改的数据?我没有保存到数据库?

4 个答案:

答案 0 :(得分:2)

这是因为你仍在查看相同的TaskComment个对象。

对特定评论的引用可能在两个集合commentsCollectioncomments中,但它只是一个对象。你得到的对象如何并不重要,如果你操纵它,它就会改变。

想象一下你的对象,在本例中是注释,作为方框。你将一个红色的字符串绑在每个盒子上,然后将字符串交给Alice来保存。然后你将一个蓝色的字符串绑在每个盒子上,并将这些字符串交给Bob来保存 现在让我们说鲍勃拉上一根绳子并得到一个盒子。他打开盒子,把一块大理石放进去,把盒子推回原处 现在爱丽丝拉上那个盒子的字符串并拿到盒子。如果她打开它,她会在里面找到一块大理石。

如果再次致电task.getComments(); ,会发生什么情况取决于具体实施情况。 如果您没有保存到数据库,如果该方法每次都从数据库中获取它们,那么您不应该看到这些注释中的任何更改。好像你为Alice买了一套新盒子。

然而,更有可能的是,当您从数据库加载Task时,它会加载相关的注释,并将它们添加为任务的属性。然后,每次调用以获取注释,您都不会从数据库中获取它们,而是从Task对象获取它们。 那些评论是Alice和Bob都有字符串绑定的评论。

答案 1 :(得分:1)

在您的示例中,您只创建了一个对象task.getComments();,该对象由commentsCollectioncomments引用变量引用。

因此,对象的更改将反映到两个引用变量中。

Collection<TaskComment> commentsCollection = task.getComments();
ArrayList<TaskComment> comments = new ArrayList();
for(TaskComment cmnt : commentsCollection ){
    comments.add(cmnt.clone());
 }

覆盖clone类中的TaskComment方法,如下所示:

public Object clone() {
    //deep copy
    TaskComment newObject = new TaskComment();
    //Now copy each property of original object to the new object.
    //e.g. newObject.setProperty(this.getProperty()); 
    return newObject;
  }

答案 2 :(得分:1)

这种情况正在发生,因为通过执行下面的行,您将获得一个包含实际对象的引用集合

Collection<TaskComment> commentsCollection = task.getComments();

喜欢

commentsCollection
  --> 0th element in commentsCollection --> (TaskComment object 1)
  --> 1st element in commentsCollection --> (TaskComment object 2)
  --> 2nd element in commentsCollection --> (TaskComment object 3)

现在,您将在注释ArrayList

中复制它
ArrayList<TaskComment> comments = new ArrayList<>(commentsCollection);

但仍然会像

comments
  --> 0th element in comments --> (TaskComment object 1)
  --> 1st element in comments --> (TaskComment object 2)
  --> 2nd element in comments --> (TaskComment object 3)

现在,当您尝试访问对象时,您实际上正在对TaskComment对象(1,2和3)进行更改,这就是task.getcomments()更改的原因。

答案 3 :(得分:1)

在您的代码中,实际对象即commentsCollection引用将被分配给comments集合,之后,您将迭代此集合,并在迭代此新集合对象时{{1} },您正在修改实际参考,即comments

在Java中,您可以创建一个对象并通过多个引用来引用它,这些引用间接地保存指向该对象的指针。在任何引用上调用mutator方法将有效地修改唯一对象,从而更新所有其他引用。