簡體   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