我有一个ArrayList
,其中包含我在其中定义的一些对象。根据一些标准,我想将第一个列表中的一些对象复制到第二个列表(开始为空),但是我复制的这些对象可以被复制多次(可以是重复的)。
为简化示例,假设我的第二个列表只包含2个重复的对象。对象a和b。
如果我修改对象a中的某些内容,该修改是否也会出现在对象b上?它只是一个传递的引用,或者它是一个对象的副本?
for( int i = 0; i < Selected.size(); i++)
{
double chance = random.nextInt(100);
chance = chance/100;
if( chance >= constCrossover )
{
Cross.add(Selected.get(i));
//here i add items that might be duplicates
}
}
我将在Cross列表中进行进一步修改,我不希望重复的对象与其他人交互。
答案 0 :(得分:7)
总是一个参考。表达式的值,数组中的值等始终是引用值或原始值。没有什么会隐含地复制一个对象 - 你必须明确地这样做。
(另外,您应该遵循Java命名约定 - Selected
和Cross
应该是selected
和cross
。)
答案 1 :(得分:2)
是的,对第二个列表中单个对象的更改将反映在所有重复项上。为避免这种情况,您可能需要克隆您的对象,即通过复制构造函数。
答案 2 :(得分:2)
它始终是一个复制到新数组列表的引用,以避免在您的对象中使用此实现克隆,并在第二个arraylist中添加克隆对象。
答案 3 :(得分:1)
不要查看对象..查看引用..如果“a”和“b”引用都指向同一个对象,那么如果通过“a”更改对象,那么当“b”访问它时,可以看到“a”所做的更改。
答案 4 :(得分:0)
这将是一个参考,因此一个中的变化将在另一个中可见。你必须
我认为最好在Java中使用for循环的foreach
模式。
for (YourObject yourObject : selected) {
if(yourObjectShouldBeAdded) {
cross.add(new YourObject(yourObject)); //initialize new copy in any way needed
}
}
另一种方法是使用Guava库:Lists和Iterables。这样:
List<YourObject> cross = Lists.newArrayList(Iterables.filter(selected, new Predicate<YourObject>() {
@Override
public boolean apply(YourObject input) {
if(yourObjectShouldBeAdded) {
return true;
}
}
}));
我认为在您的情况下,条件yourObjectShouldBeAdded
指的是随机数chance
大于常数constCrossover
。你可以简单地替换它。