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

オブジェクトをマップに配置しません。ヒープ上に存在するオブジェクトへの参照を追加します。

Java データ構造は、オブジェクト自体ではなく、オブジェクトへの参照を保持します。データ構造から参照を削除しても、他のオブジェクトにはその参照のコピーが残っている可能性があります。

2 つのオブジェクトが変更可能なオブジェクトへの参照を保持している場合、それぞれが他方によって行われた変更を認識します。(これが、スレッドセーフが重要な理由です。)

誰もヒープ上のオブジェクトを参照していない場合、そのオブジェクトは GC の対象になります。

于 2012-10-24T10:55:11.670 に答える
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 に答える
2

いいえ、HashSet追加したオブジェクトのコピーは作成されません。

于 2012-10-24T10:55:23.717 に答える
2

オブジェクトをセットに入れた後はオブジェクトを変更してはならないことを警告しなければなりません— そしてそれがあなたのコードで行っていることです: リストをセットに追加し、後でそれを更新します。これにより、ハッシュコードが台無しになり、HashSet が壊れます。そこには Set さえ必要ないかもしれませんが、別のリストが必要です。

リストの安全なコピーをセットに簡単に追加するには、クローンを作成するか (他の場所で提案されているように)、明示的にnew ArrayList(someList).

于 2012-10-24T10:59:31.887 に答える
1

セットはリストへの参照を保持するため、リストは 1 つだけです。元のリストにアイテムを直接追加/削除するか、セット内のリストを使用できます。同じ効果があります。

于 2012-10-24T10:55:41.297 に答える