我有一个问题,我从列表(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);
}
}
答案 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++) {
...
}
我怀疑它必须在循环后移动才能正常工作。