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

标签 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 中的项目时无效?谢谢。

最佳答案

以下代码将 arrayList 中的 1000 个元素添加到 testArrayList

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

下面的代码再次将相同的 1000 个元素从 arrayList 添加到 testArrayList。这不是重新填充,而是向数组添加更多

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

重新填充将使用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() 方法,该方法将指定集合中的所有元素追加到该列表的末尾,在它们由指定集合的​​迭代器返回的顺序。

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

关于java - 使用remove方法之前/之后重新填充arrayList的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26854312/

相关文章:

java - 更改 JLabel 中图标的颜色

java - 特定文件处理需求的数据结构选择 - java

java.lang.OutOfMemoryError : Java heap space. 尝试将扫描仪输入值添加到 ArrayList

java - Coldfusion 读取不带扩展名的 XML HTTP

java - 在多进程设置中生成 6 位字母数字唯一标识符的任何算法/逻辑

java - java8 从列表映射中获取单个键的所有值

c - C 中的 Arraylist 不工作

Java相当于python数组初始化

java - 无法使用 Java ProcessBuilder 启动带有参数的 shell 脚本

java - 有2个toString方法吗?