ArrayList的奇怪行为

Dus*_*all 1 java arraylist

我正在使用csv文件构建基本数据库,我正在测试select函数,当我遇到一些奇怪的东西时.

private ArrayList<Record> selectField(String selectTerm)
{
    Log.log("Selection " + selectTerm,2,"DB_io");

    ArrayList<Record> ret = new ArrayList<Record>();

    if (titleRow.values.contains(selectTerm))
    {
        Log.log("Adding values to " + selectTerm);
        int ordinal = titleRow.values.indexOf(selectTerm);
        Log.log("Ordinal " + ordinal);
        List<String> tempList = new ArrayList<String>();

        for (Record r : data)
        {
            List<String> tempList = new ArrayList<String>();
            tempList.add(r.values.get(ordinal));
            Record s = new Record(tempList);
            ret.add(s);
            tempList.clear();
        }

        Log.log("Number of records in ret " + ret.size());
        for (Record t : ret)
        {
            Log.log(t.toString());
        }

    }
    else
    {
        Log.log("keyField does not contain that field");
        return null;
    }

    Log.log("Values " + ret.toString());
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时,它记录的部分t.ToString()显示记录为空,而如果我在tempList.clear()之前记录它,它显示记录包含它应该的数据.

如果我将tempList声明移动到Record r:data循环中,那么它工作正常并且Record t:ret循环工作输出记录的内容就像它应该

为什么是这样?

编辑:记录课程

public class Record
{
    List<String> values = new ArrayList<String>();

    public Record(List<String> terms)
    { 
        this.values = terms;
    }

    public Record(String[] s)
    {
        this.values = Arrays.asList(s);
    }

    public String toString()
    {
        return values.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 6

您的Record实例包含对ArrayList传递给其构造函数的实例的引用.因此,当您打电话tempList.clear(),您清除相同List,你的Record实例抱着一个参考.

你不应该打电话tempList.clear(),因为ArrayList无论如何你在循环的每次迭代中创建一个新的.