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