[英]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.