对于那些读过我first question的人,我想我发现了问题所在。问题出在mutate
方法中,尤其是在这条指令中:
Chromosom ch=new Chromosom(); // Chromosom is a class who use hash table
Chromosom k= new Chromosom(); // Class chromosom extends hashmap <integer,parc>
k.initialise();
for(int i=0;i<l.size();i++) ch.put(i,k.get(i)); // in this instruction i think
这是Chromosom的构造函数:
public Chromosom(){ // construct a blank chromosom
super();
this.identifiant = 0;
NbEquipeExterne = 0;
NbEquipeInterne = 0;
CoutMinimal = 0;
CoutMensuel = 0;
}
当我更改ch
的值时,k
的值也会改变?
如何通过复制而不是引用将k
的值传递给ch
?
答案 0 :(得分:0)
首先,Java is always pass-by-value.或更确切地说传递给变量值的副本不通过引用传递。您可能正在构造函数中使用Chromosom
更改k
的对象。
答案 1 :(得分:0)
没有危险,ch
和k
都是单独的对象。
此外你可以做到
ch.putAll(k);
这是一个很好的捷径。
<强> 买者 强>
如果地图的值是有状态对象(包含可变字段以包含某些更改信息),则更改该字段将更改两个表中的simgle值对象的字段。
BitSet bits = k.get(i);
bits.set(3);
// Now ch.get(i) being the same object, also has bit 3 set.
如果一个类有一个static
字段,那么该字段每个类只有一个实例。所以你可以说染色体:
static String copyright;
Chromosome.copyright = "All rights reserved"; // Clearest style
k.copyright = "All rights given to the community";
ch.copyright = "MIT license";
你会使用vaklue“麻省理工学院执照”来处理同一个变量。
关于Java
在java中做出了一个很好的设计决定: