通过引用列表Java

时间:2014-07-02 16:53:48

标签: java arrays list pointers garbage

List<List<String>> lists = new ArrayList();

//fileName is a list of files to iterate through and extract data from

for (int x=0; x<fileName.size(); x++) {

    // CSV Reader object
    CSVReader readFile = new CSVReader(new FileReader(fileName.get(x)));

    String[] nextLine = readFile.readNext(); // Parses through first line with headers

    /**
     * Populates each array with appropriate data
     */
    List<String> tempList = new ArrayList();

    while ((nextLine = readFile.readNext()) != null) {
        tempList.add(nextLine[0]);
    }

    readFile.close();

    lists.add(tempList);

}

我的问题是我认为数组列表是通过引用传递的。当我运行它时,我基本上创建了一个列表列表,然后为我添加的每个文件填充。我认为只要退出此for循环,“tempList”数据就会被取消引用并打开改变记忆。但是,在我的测试中,数据通过一系列计算保持不变而没有任何变化。这是什么原因?

我将在for循环中创建的arraylist传递给另一个列表列表。为什么退出for循环时这个临时列表不会被抛入垃圾收集?

2 个答案:

答案 0 :(得分:0)

您在tempList内添加了对lists的引用。

lists.add(tempList);

由于lists引用的对象是可访问的,因此每个引用的对象tempList也是可访问的。他们不能成为GC。

答案 1 :(得分:0)

lists中存储对创建的tempLists的引用。退出for循环时,引用会保留在那里。如果你想释放它们,那么就可以收集垃圾了。你可以打电话给clear()

List<List<String>> lists = new ArrayList<ArrayList<String>>();

for (int x=0; x<fileName.size(); x++) {
  //populate data to lists
}

//operate on lists data

lists.clear(); // release the references

GC,只能从不引用其他对象的对象释放内存。