繁体   English   中英

ArrayList的奇怪行为

[英]Strange behaviour with 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;
}

当我这样做时,它记录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();
    }
}

您的Record实例包含对传递给其构造函数的ArrayList实例的引用。 因此,当您调用tempList.clear() ,将清除您的Record实例持有其引用的List

您不应该调用tempList.clear() ,因为无论如何在循环的每次迭代中都创建一个新的ArrayList

您从多个位置引用对象,并且clear方法通过将其引用设置为null来清除对象:

而不是ret.add(s); 您可以使用ret.add(s.clone()) ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM