0

次のコードがあります。

  result = binding.downloadData(sourceURLString.replace("{CAT_ID}", catId), Data.class);

  ArrayList<Data> mAllProducts = result.getProducts();
  cloneList(mAllProducts);
  System.gc();

そして、mAllProducts ArrayList のディープ コピーは次のとおりです。

  static List<Data> clone;
  public static void cloneList(ArrayList<Data> list) {
    clone = new ArrayList<Data>();
    for(Data item: list){ 
        clone.add(new Data(item));
         }
 }

データ コンストラクター:

 public Data(Data item2) {
    this.imageUrl = item2.imageUrl;
                   *
                   *
  }

私の質問は次のとおりです。

  1. mAllProducts arraylist はガベージ コレクターによって収集されますか?
  2. クローン リストは値渡しの ArrayList ですか?
  3. 2 番目の質問の答えが「はい」の場合、それはクローン配列リストにメモリへの参照がないことを意味しますか?
  4. 最後に、2 番目の質問の答えが「はい」の場合、それは、システムが使用している間だけメモリにとどまり、その後ガベージ コレクションが行われることを意味しますか?
4

2 に答える 2

5

1) 知る方法はありません。gc 呼び出しは、JVM がコレクションを実行しようとすることを単に示唆しているだけです。

2) Java のすべては値渡しです。

3) 何を言っているのかわかりません。しかし、クローンは、リストの新しいアイテムを作成し、アイテムがオブジェクトへの参照を共有していないと仮定すると、元のリストから完全に分離されています。int のようなプリミティブ値は不変です。心配する必要があるのはオブジェクト インスタンスだけです。コピー コンストラクターを使用しているようです。そのため、各アイテムに含まれるオブジェクトと、その子に含まれる可能性のあるアイテムをコピーする場合は特に注意してください。コピーは深くする必要があります。

4) 何を言っているのかわかりません。オリジナルへの参照がない場合は、次回 GC が実行されたときにコレクションの対象になります。

于 2012-12-14T13:41:08.160 に答える
1

mAllProducts arraylist はガベージ コレクターによって収集されますか?

1) ガベージ コレクターがそうすることを決定したとき、および 2) 範囲外になったときのみ

クローン リストは値渡しの ArrayList ですか?

はい

2 番目の質問の答えが「はい」の場合、それはクローン配列リストにメモリへの参照がないことを意味しますか?

メモリ内のあるポイントへの参照が絶対に必要です。そうでなければ、論理システム、つまりコンピュータには存在できません。

最後に、2 番目の質問の答えが「はい」の場合、それは、システムが使用している間だけメモリにとどまり、その後ガベージ コレクションが行われることを意味しますか?

この場合も、ガベージ コレクターは、適切と判断されたときにそれを収集します。

于 2012-12-14T13:43:04.823 に答える