2012-12-14 27 views
0

我有以下代码:Java的ArrayList的内存问题

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. 如果第二个问题的答案是肯定的,那意味着克隆数组列表没有对内存的引用?
  4. 最后,如果第二个问题的答案是肯定的,那意味着只会留在系统正在使用的时间内存,然后会被垃圾收集?
+0

尚未完成读取,但您应该使用'clone = new ArrayList (list.size());'以便新列表具有正确的大小,并且不必在添加很多条目。 – jlordo

+1

1.是的。 2.是的。 3.是的。 4.是的。 – Doorknob

回答

5

1)没办法知道,你的gc调用只是JVM试图执行一个集合的建议。

2)Java中的所有东西都是按值传递的。

3)我不知道你的意思。但是,假设它为列表创建新项目,并且项目不共享对任何对象的引用,则您的克隆与原始列表完全分离。像int这样的基本值是不可变的,它只是您必须担心的对象实例。看起来你正在使用拷贝构造函数,所以要特别小心你拷贝每个项目包含的任何对象,以及这些子项可能包含的任何项目;你的副本需要很深。

4)我不知道你的意思。如果您没有任何对原件的引用,那么下次GC运行时将有资格收集。

+0

3.是的,这是传递价值。是的,当没有对它的引用时,它将被GCd。 5. upvote。 :) – Doorknob

1

垃圾收集器收集的mAllProducts arraylist是否会被?

只有当1)垃圾收集器决定这样做; 2)当超出范围

是一款由值的ArrayList通过克隆列表?

如果在第二个问题的答案是肯定的,这意味着,克隆的ArrayList没有到存储器的参考?

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

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

再次,垃圾收集器将收集它时,它被认为适合这样做。