java:数据元素更改影响“无关”数据结构

时间:2011-07-03 16:51:58

标签: java pointers data-structures

我有一个问题,我从列表(list1)中检索和元素,并修改元素中的一个参数,然后将其添加到另一个列表(list2)。当我对list1中的最后一项执行此操作时,它有时会修改list2中元素的参数。

这个函数每代被调用一次,但直到第8代才开始看到这种情况发生。它影响list2中2到16个元素。

我的搞砸可能是什么想法?这是我写的一段代码来说明问题。问题发生在我检查计数== 0。

的部分
    public void sampleCode (List list) {
    List differentList = new ArrayList();
    Individual element;
    Individual differentelement;
    int i = 0;
    int count = 0;
    for(i = 0; i < list.size(); i++) {

        element = (Individual) list.get(i)  ;


        // does some checking to see if this meets criteria
        // this is sorta pseudo code
        if(probability == true) { 
            element.setDoMutation(true);
            count++;
        }
        //always add this element to differentList
                    //even if no changes are made to the element
        differentList.add(i,element);
    }
        //need to make sure one elements has mutation=true;
    if(count == 0) { 
        differentelement = (Individual) list.get((list.size()-1));

        //setting this element field changes the contents of
        //different list.
        differentelement.setDoMutation(true);
        differentList.set((list.size()-1), differentelement);
    }   
}

2 个答案:

答案 0 :(得分:2)

在Java中,变量不包含对象。它包含一个对象引用(即指向对象的指针)。从列表中获取对象并将其放入另一个列表中不会复制该对象。两个列表都只有一个指向同一对象的指针。所以,当然,如果修改对象的内容,两个列表都将修改对象。

旁注:您应该使用参数化类型(即List<Individual>而不是List),并避免在方法开头声明变量,就像在C中一样。仅在您声明变量时需要它。这将使代码更清晰,并减少变量的范围。

答案 1 :(得分:0)

你确定阻止

    //need to make sure one elements has mutation=true;
    if(count == 0) { 
        differentelement = (Individual) list.get((list.size()-1));

        //setting this element field changes the contents of
        //different list.
        differentelement.setDoMutation(true);
        differentList.set((list.size()-1), differentelement);
    }   

必须在循环内

for(i = 0; i < list.size(); i++) {
    ...
}

我怀疑它必须在循环后移动才能正常工作。