java - 当尝试操作 ArrayList 时,复制 ArrayList 还是使用 ListIterator 更快?

标签 java arraylist listiterator

我有多个包含大量数据的 ArrayList,我需要快速有效地操作数据。我的代码当前复制了原始的 ArrayList,以便我可以进行更改(避免 ConcurrentModificationException)。这种方法似乎效率有些低。

我研究了ListIterator,它们看起来更加“干净”和高效。我进行了一个快速测试,看看哪个实际上更快,似乎复制原始的 ArrayList 可能会更快。这是真的还是我的测试有某种缺陷?如果这是真的,它是否只适用于较小的 ArrayList?

我运行的测试如下:

long startTime, stopTime;

ArrayList<ArrayList<String>> array = new ArrayList<>();

ArrayList<String> a1 = new ArrayList<>();
ArrayList<String> a2 = new ArrayList<>();
ArrayList<String> a3 = new ArrayList<>();

for (int i = 0; i < 5; i++) {
    a1.add(Integer.toString(i));
    a2.add(Integer.toString(i));
    a3.add(Integer.toString(i));
}

array.add(a1);
array.add(a2);
array.add(a3);

startTime = System.nanoTime();

ArrayList<ArrayList<String>> arrayCopy = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
    ArrayList<String> line = array.get(i);
    arrayCopy.add(i, new ArrayList<>(line.size()));
    for (int j = 0; j < line.size(); j++) {
        arrayCopy.get(i).add(j, line.get(j));
    }
}

for (int j = 0; j < array.size(); j++) {
    for (int i = 0; i < array.get(j).size(); i++) {
        if (array.get(j).get(i).equals("2")) {
            arrayCopy.get(j).add(i, "1.5");
        }
    }
}

stopTime = System.nanoTime() - startTime;

System.out.println(arrayCopy.get(0));
System.out.println(arrayCopy.get(1));
System.out.println(arrayCopy.get(2));

System.out.println(stopTime);

ArrayList<ArrayList<String>> brray = new ArrayList<>();

ArrayList<String> b1 = new ArrayList<>();
ArrayList<String> b2 = new ArrayList<>();
ArrayList<String> b3 = new ArrayList<>();

for (int i = 0; i < 5; i++) {
    b1.add(Integer.toString(i));
    b2.add(Integer.toString(i));
    b3.add(Integer.toString(i));
}

brray.add(b1);
brray.add(b2);
brray.add(b3);

startTime = System.nanoTime();
for (ArrayList<String> s : brray) {
    ListIterator<String> i = s.listIterator();
    while (i.hasNext()) {
        if (i.next().equals("1")) {
            i.add("1.5");
        }
    }
}

stopTime = System.nanoTime() - startTime;

System.out.println(b1);
System.out.println(b2);
System.out.println(b3);

System.out.println(stopTime);

运行代码五次,复制方法的时间为 73307、46916、77705、76606 和 82470 的时间(以纳秒为单位),以及 307888、319984、304590、363235 和 280032 用于 ListIterator 方法。

最佳答案

如果不查看它们的实现,但通过一些测试,我不确定:

对于较大的尺寸,ListIterator 将击败 ArrayList 方法。

对于较小的大小,仅创建 ListIterator 比 ArrayList 方法花费的时间更长。

此外,时间基准有点值得怀疑,因为它不仅仅是程序本身。尤其是在 10^(-3) 秒内。

关于java - 当尝试操作 ArrayList 时,复制 ArrayList 还是使用 ListIterator 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34024600/

相关文章:

java - 流畅地重新排序 JList 的 "best"方法是什么?

Java ArrayList - 检查元素是否为空

java - ArrayList 初始大小不起作用

java - 将列表迭代器传递给 Java 中的多个线程

java - 如何将已解析的 JSON 图像从 URL 动态添加到 imageView?

java - 用空间来解释这个奇怪的现象

java - 负载均衡器通过 TCP 并使用 TLS 协议(protocol)传递消息

java arraylist 存储用户输入

Java:在循环中修改列表时避免使用 ListIterator 并发修改异常

java - 列表迭代器卡住-Java