ArrayBuffer如何在内存中工作?

时间:2014-09-26 21:13:27

标签: java scala arraybuffer

我想在我的程序中使用ArrayBuffer来保存数字列表。我想用它作为队列。每次删除列表中的第一项并使用它。然后我想知道每次删除第一个项目时,队列中的所有其他数字都会移动一个地方。我的意思是下次我可以再次阅读第(0)项吗?

4 个答案:

答案 0 :(得分:3)

如果您查看Scala source code或ArrayBuffer,您会看到remove的以下实现:

/** Removes the element on a given index position. It takes time linear in
   *  the buffer size.
   *
   *  @param n       the index which refers to the first element to delete.
   *  @param count   the number of elements to delete
   *  @throws Predef.IndexOutOfBoundsException if `n` is out of bounds.
   */
  override def remove(n: Int, count: Int) {
    require(count >= 0, "removing negative number of elements")
    if (n < 0 || n > size0 - count) throw new IndexOutOfBoundsException(n.toString)
    copy(n + count, n, size0 - (n + count))
    reduceToSize(size0 - count)
  }

因此,删除的元素将不再存在于数组中,但实际上,删除意味着复制所有元素(&#34;在您的定义中移位&#34;),对于更长的数组,它将会很慢。

答案 1 :(得分:2)

ArrayBuffer基本上是一个实现Buffer所有方便方法的数组。

它按您描述的方式工作:如果删除一个元素,所有剩余的元素都会转移到“填补空白”,并且如文档中所述,特别是如果删除第一个元素可能需要一些时间:

  

追加,更新和随机访问需要恒定时间(摊销时间)。 Prepends和remove在缓冲区大小上是线性的。

因此我不建议使用ArrayBuffer作为队列。

实际上,最好的选择是您的问题:只需使用Queue 。它的设计是......好吧......一个队列!

答案 2 :(得分:2)

为什么不将队列用作队列? Java Queue

它有一个名为 poll()的好方法(检索并删除此队列的头部,如果此队列为空,则返回null。

这不是您需要的吗?它的性能也比您的阵列解决方案更好。

答案 3 :(得分:0)

如果要使用数组支持的数据结构(例如,对于运行时(缓存局部性)或存储(没有下一个指针)效率原因),您可能需要考虑java.util.ArrayDeque。此类有效地实现了一个圆形数组,该数组在满时调整大小。 poll()(检索和删除第一个元素)方法只需增加起始偏移量

即可实现

缺点是,即使此类实现了java.util.Queue接口,也没有隐式转换为scala.collection.mutable.Queue,因此您无法使用Scala集合方法,例如{{1等等。

注意:从2.11开始,Scala没有map接口,只留下Deque实现。