ArrayList中的重复对象是对单个对象的引用?

时间:2013-12-18 08:49:26

标签: java arraylist reference

我有一个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列表中进行进一步修改,我不希望重复的对象与其他人交互。

5 个答案:

答案 0 :(得分:7)

总是一个参考。表达式的值,数组中的值等始终是引用值或原始值。没有什么会隐含地复制一个对象 - 你必须明确地这样做。

(另外,您应该遵循Java命名约定 - SelectedCross应该是selectedcross。)

答案 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库:ListsIterables。这样:

List<YourObject> cross = Lists.newArrayList(Iterables.filter(selected, new Predicate<YourObject>() {
                              @Override
                              public boolean apply(YourObject input) {
                                  if(yourObjectShouldBeAdded) {
                                      return true;
                                  }
                               }
                          }));

我认为在您的情况下,条件yourObjectShouldBeAdded指的是随机数chance大于常数constCrossover。你可以简单地替换它。