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 数组列表吗?
  2. 克隆列表是按值传递的 ArrayList 吗?
  3. 如果第二个问题的答案是肯定的,这意味着克隆数组列表没有对内存的引用?
  4. 最后,如果第二个问题的答案是肯定的,这意味着它只会在系统使用的时间停留在内存中,然后将被垃圾收集?
4

2 回答 2

5

1)无法知道,您的 gc 调用只是 JVM 尝试执行收集的建议。

2) Java 中的一切都是按值传递的。

3)我不明白你的意思。但是您的克隆,假设它为列表创建新项目,并且这些项目不共享对任何对象的引用,则与原始列表完全分开。像 int 这样的原始值是不可变的,它只是您需要担心的对象实例。看来您正在使用复制构造函数,因此要格外小心复制每个项目包含的任何对象,以及这些子项可能包含的任何项目;你的副本需要很深。

4) 我不明白你的意思。如果您没有对原始文件的任何引用,它将有资格在下次 GC 运行时进行收集。

于 2012-12-14T13:41:08.160 回答
1

垃圾收集器会收集到mAllProducts 数组列表吗?

仅当 1) 垃圾收集器决定这样做和 2) 当它超出范围时

克隆列表是按值传递的 ArrayList 吗?

是的

如果第二个问题的答案是肯定的,这意味着克隆数组列表没有对内存的引用?

绝对需要对内存中某个点的引用,否则它不能存在于逻辑系统(即计算机)中。

最后,如果第二个问题的答案是肯定的,这意味着它只会在系统使用的时间停留在内存中,然后将被垃圾收集?

垃圾收集器会在认为合适时再次收集它。

于 2012-12-14T13:43:04.823 回答