1

假设我有一个递归函数,就像这样

public void someRecur(List<Integer>someList){
  if(someBreakCondition)
    Set.add(someList);
  for(int i = 0; i < someLen ; i++){
    someList.add(someInt);
    someRecur(someList);
    someList.remove(someInt);
   }
}

删除是否影响已放入集合的列表?我应该怎么做才能给集合一个列表的实际副本?

4

5 回答 5

3

删除是否影响已放入集合的列表?

是的,会受到影响。您放入 Set 的不是实际列表,而是对该列表的引用。因此,当列表被修改时,所有指向该列表的引用都会看到更改。

我应该怎么做才能给集合一个列表的实际副本?

因为,您可以创建一个新列表,并将原始列表中的所有元素添加到该列表中并将其添加到您的Set-

List<Integer> newList = new ArrayList<Integer>();
newList.addAll(someList);
set.addAll(newList);

或者,简单地说: -

set.addAll(new ArrayList<Integer>(someList));
于 2012-10-24T10:56:46.567 回答
3

您不会将对象放入地图中;您添加对堆中存在的对象的引用。

Java 数据结构保存对对象的引用,而不是对象本身。如果从数据结构中删除引用,其他对象可能仍具有该引用的副本。

如果两个对象持有对可变对象的引用,那么每个对象都会看到另一个对象所做的更改。(这就是为什么线程安全很重要。)

当没有人引用堆上的对象时,它就有资格进行 GC。

于 2012-10-24T10:55:11.670 回答
2

我必须警告您,在将对象放入集合后,您不能更改它——这就是您在代码中所做的:您将列表添加到集合中,然后再更新它。这会弄乱它的哈希码并破坏 HashSet。也许你甚至不需要一个 Set 那里,而是另一个列表。

您可以通过克隆(如其他地方所建议的那样)或通过显式构造一个new ArrayList(someList).

于 2012-10-24T10:59:31.887 回答
2

不,HashSet不会复制您添加到其中的对象。

于 2012-10-24T10:55:23.717 回答
1

该集合将保存对列表的引用-因此只有一个列表。您可以直接在原始列表中添加/删除项目,也可以使用集合中的列表:它具有相同的效果。

于 2012-10-24T10:55:41.297 回答