二维数组列表(数组列表的数组列表)中的ArrayList.clear()



所以我有一些问题与添加数组列表到我的数组列表。把它想象成一个表。

下面是一些示例代码:

 ArrayList<String> currentRow = new ArrayList<String>(); 
  while ((myLine = myBuffered.readLine()) != null) {
    if(rowCount == 0) {// get Column names  since it's the first row
        String[] mySplits;
        mySplits = myLine.split(","); //split the first row
        for(int i = 0;i<mySplits.length;++i){ //add each element of the splits array to the myColumns ArrayList
            myTable.myColumns.add(mySplits[i]);
            myTable.numColumns++;
            }
        }
    else{ //rowCount is not zero, so this is data, not column names.
    String[] mySplits = myLine.split(","); //split the line
    for(int i = 0; i<mySplits.length;++i){
    currentRow.add(mySplits[i]); //add each element to the row Arraylist
    }
    myTable.myRows.add(currentRow);//add the row arrayList to the myRows ArrayList
    currentRow.clear(); //clear the row since it's already added
        //the problem lies here *****************
     }
    rowCount++;//increment rowCount
    }
 }

问题是,当我不调用currentRow.clear()来清除我在每次迭代中使用的ArrayList的内容(放入我的ArrayList of ArrayList)时,每次迭代,我得到那一行加上每一行。

但是当我把currentRow添加到我的arrayList<ArrayList<String>后调用currentRow.clear()时,它实际上清除了我添加到主数组列表以及currentRow对象....的数据我只想让currentRow数组列表为空,而不是我刚刚添加到我的数组列表(Mytable.MyRows[currentRow])的数组列表。

谁能解释一下这是怎么回事?

问题在这里:

myTable.myRows.add(currentRow);

您将ArrayList currentRow添加到这里的"master"列表中。注意,在Java语义下,您正在向currentRow变量添加一个引用

在下一行,立即清除currentRow:

currentRow.clear()

因此,当您稍后尝试使用它时,"主"列表会查找之前的引用,并发现虽然存在ArrayList对象,但其中不包含String

你真正想做的是用新的 ArrayList重新开始,所以用下面的代码替换上一行:

currentRow = new ArrayList<String>();

那么旧对象仍然被"主"列表引用(因此它不会被垃圾收集),并且当以后访问它时,它的内容将不会被清除。

不要清除当前行,而是在外部循环中为每一行创建一个全新的ArrayList。

当你向列表添加currentRow时,你是在向列表添加一个引用,而不是一个将继续独立存在的副本。

相关内容

  • 没有找到相关文章

最新更新