java - 为什么初始容量对于从 ArrayList 中删除很重要?

标签 java

对于我的工作,我对时间表做了一些测试。 我遇到了一些令我惊讶的事情,需要帮助来理解它。

我使用了很少的数据结构作为队列,并且想知道根据项目数量删除的速度如何。而具有 10 个项目的 arraylist,从前面删除且未设置初始容量比设置初始容量(至 15)要慢得多。为什么?以及为什么 100 项内容相同。

这是图表: enter image description here

数据结构:L - 实现列表,C - 设置初始容量,B - 从后面删除,Q - 实现队列

编辑: 追加相关代码

new Thread(new Runnable() {
 @Override
 public void run()
 {
  long time;
  final int[] arr = {10, 100, 1000, 10000, 100000, 1000000};
  for (int anArr : arr)
  {
    final List<Word> temp = new ArrayList<>();
    while (temp.size() < anArr) temp.add(new Item());

    final int top = (int) Math.sqrt(anArr);

    final List<Word> first = new ArrayList<>();
    final List<Word> second = new ArrayList<>(anArr);
    ...
    first.addAll(temp);
    second.addAll(temp);
    ...

    SystemClock.sleep(5000);

    time = System.nanoTime();
    for (int i = 0; i < top; ++i) first.remove(0);
    Log.d("al_l", "rem: " + (System.nanoTime() - time));

    time = System.nanoTime();
    for (int i = 0; i < top; ++i) second.remove(0);
    Log.d("al_lc", "rem: " + (System.nanoTime() - time));

    ...
   }
  }
}).start();

最佳答案

阅读这篇关于 Avoiding Benchmarking Pitfalls on the JVM 的文章。它解释了 Hotspot VM 对测试结果的影响。如果你不关心它,你的测量就不正确。正如您通过自己的测试发现的那样。

如果您想做可靠的基准测试,请使用 JMH .

关于java - 为什么初始容量对于从 ArrayList 中删除很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36986192/

相关文章:

java - Eclipse AWS Explorer 无法看到使用 Java 创建的 Dynamodb 表

java - openGL GLSL "void"顶点着色器解析错误

java - JZOS 批量启动器 - 使用 SYSIN DD 中的 java 源代码运行 JCL 作业 *

java - 如何为 XStream 使用 StAX 而不是 XPP?

java - 取消 SwingWorker 时出现问题

java - Junit异常测试

java - 编写一个方法,该方法采用整数堆栈作为参数,并从堆栈底部开始切换连续的数字对

java - LocalDateTime 设置以秒为单位计算重叠

JavaFX:如何更改焦点遍历策略?

java - 自定义 IBM MQ 的自动重新连接设置