代码之家  ›  专栏  ›  技术社区  ›  Matthew

Java ArrayList存储

  •  3
  • Matthew  · 技术社区  · 11 年前

    我知道ArrayList引用是连续存储在堆中的。但是,如果我在数组列表的中间添加一个元素

    ArrayList<Double> list = new ArrayList<Double>(Collections.nCopies(10, 6.5));
    
    list.add(5, 20.0);
    

    这如何改变它在堆中的存储方式?第一个参考的位置是移动到新的存储单元,还是在20.0被插入之后所有刚刚移动过存储单元5的东西都向下移动?

    2 回复  |  直到 11 年前
        1
  •  2
  •   arshajii    11 年前

    这取决于。

    想一想 ArrayList 作为(内部)一个固定大小的缓冲区,每当空间用完时都会调整大小。如果您尝试在中间插入一个元素,并且缓冲区中还有空间,那么可以简单地向下移动所有内容以为新元素腾出空间。但是,如果没有剩余空间,则需要调整缓冲区的大小,这就需要重新分配缓冲区,从而 能够 需要将所有元素复制到内存中的新位置。请注意,将缓冲区移动到新位置的决定不是由Java虚拟机做出的,而是由操作系统做出的。

        2
  •  1
  •   JNYRanger    11 年前

    创建Collection对象时,它会分配一定大小的内部数组。如果初始化空ArrayList,则通常大于1。当达到最大容量限制时,集合将自动创建一个比当前数组大的新内部数组,并将元素复制到新数组。在许多实现中,只要达到数组的“极限”,它的大小就会翻倍。

    在这种特殊情况下,您将创建一个大小为10的基础数组,然后执行扩展&在处理所调用的add方法期间执行复制操作。