使用remove方法之前/之后重新填充arrayList的效果

时间:2014-11-10 22:36:31

标签: java arraylist

为什么在使用remove方法之前重新填充数组会影响使用remove方法后的内容?

我正在尝试从最高索引开始从ArrayList中删除所有项目(逐个元素)。复制数组的原因是我可以在以后的其他代码示例(使用修改数组的方法)中始终引用相同的数据集,这里未显示。

为什么这两个代码示例的输出都不同?

    //populate arrrayList
    for (int i = 0; i<1000; i++ ){
        int randNum = rand.nextInt(1000);
        arrayList.add(randNum);
    }
    //create a identical arrayList for testing purposes
    for (int i = 0; i<1000; i++){
        testArrayList.add(arrayList.get(i));

    // ...some other arrayList accessor methods here 

    //re-populate the testArrayList with original random numbers
    for (int i = 0; i<1000; i++){
        testArrayList.add(arrayList.get(i));
    }
    System.out.println("Contents of al: " + arrayList);
    System.out.println("Contents of tal: " + testArrayList);
    System.out.println();

    // ArrayList remove (low index to high index)
    for (int i = 0; i < 1000; i++) {
        testArrayList.remove(0);
    }
    System.out.println("Contents of al: " + arrayList);
    System.out.println("Contents of tal: " + testArrayList);
    System.out.println();

在上面的版本中,输出显示两个数组都包含完全相同的元素 - (意外)。

在下面的代码中,我删除了(我认为只是一个冗余的)重新填充循环,输出显示标题为“testArrayList”的第二个数组为空(如预期的那样)。

    //populate arrrayList
    for (int i = 0; i<1000; i++ ){
        int randNum = rand.nextInt(1000);
        arrayList.add(randNum);
    }
    //create a identical arrayList for testing purposes
    for (int i = 0; i<1000; i++){
        testArrayList.add(arrayList.get(i));

    }
    System.out.println("Contents of al: " + arrayList);
    System.out.println("Contents of tal: " + testArrayList);
    System.out.println();

    // ArrayList remove (low index to high index)
    for (int i = 0; i < 1000; i++) {
        testArrayList.remove(0);
    }
    System.out.println("Contents of al: " + arrayList);
    System.out.println("Contents of tal: " + testArrayList);
    System.out.println();

我认为第一个代码示例中的重新填充循环只是一个冗余过程,并且会在从testArrayList中删除元素之前将arrayList的内容复制到testArrayList。为什么看起来第一个示例中的循环在其后的代码之后重新填充testArrayList?我期望这两个代码示例都吐出相同的结果。任何人都可以解释为什么第一个例子在删除testArrayList中的项目时无效?感谢。

1 个答案:

答案 0 :(得分:3)

以下代码添加了从arrayListtestArrayList

的1000个元素
//create a identical arrayList for testing purposes
for (int i = 0; i<1000; i++){
    testArrayList.add(arrayList.get(i));

以下代码再次添加了arrayListtestArrayList的相同1000个元素。这是 re-population向数组添加更多

//re-populate the testArrayList with original random numbers
for (int i = 0; i<1000; i++){
    testArrayList.add(arrayList.get(i));
}

Re-population将使用set方法而不是add方法。

//re-populate the testArrayList with original random numbers
for (int i = 0; i<1000; i++){
   testArrayList.set(i,arrayList.get(i));
}

现在,当您从testArrayList中删除1000个项目时,列表将为空。

合并@JBNizet评论, 将一个集合的所有元素添加到列表中的最佳方法是调用addAll()方法,该方法将指定集合中的所有元素按其返回的顺序附加到此列表的末尾。由指定的集合的迭代器。

从列表中删除所有项目的最佳方法是调用clear()的{​​{1}}方法,删除此列表中的所有元素。该调用返回后,该列表保证为空。