Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayBuffer在内存中是如何工作的?_Java_Scala_Arraybuffer - Fatal编程技术网

Java ArrayBuffer在内存中是如何工作的?

Java ArrayBuffer在内存中是如何工作的?,java,scala,arraybuffer,Java,Scala,Arraybuffer,我想在我的程序中使用ArrayBuffer来保存数字列表。我想把它用作队列。每次删除列表中的第一项并使用它。然后我想知道每次我删除第一个项目时,队列中的所有其他数字都会移动一个位置。我的意思是,下次我可以再次阅读第(0)项吗?如果您查看Scala或ArrayBuffer,您将看到下面的删除的实现: /** Removes the element on a given index position. It takes time linear in * the buffer size.

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

如果您查看Scala或ArrayBuffer,您将看到下面的
删除的实现:

/** 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)
  }
/**删除给定索引位置上的元素。它需要线性的时间
*缓冲区大小。
*
*@param n引用要删除的第一个元素的索引。
*@param count要删除的元素数
*@如果'n'超出范围,则抛出Predef.IndexOutOfBoundsException。
*/
覆盖def删除(n:Int,计数:Int){
要求(计数>=0,“删除负数元素”)
如果(n<0 | | n>size0-count)抛出新的IndexOutOfBoundsException(n.toString)
副本(n+计数,n,大小0-(n+计数))
缩小尺寸(尺寸0-计数)
}

因此,被删除的元素将不再出现在数组中,但实际上,删除意味着复制所有元素(“在您的定义中是移位”),对于较长的数组,删除速度会很慢。

ArrayBuffer
基本上是一个数组,它实现了
缓冲区的所有方便方法

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

追加、更新和随机访问需要固定时间(摊销时间)。前置和删除在缓冲区大小中是线性的

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


实际上,最好的选择是你的问题:只需使用一个。它被设计成,嗯。。。排队

为什么不使用队列作为队列?

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


<强>这不是你需要的吗?< /强>它的性能也比你的数组解决方案好。

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

缺点是,即使该类实现了
java.util.Queue
接口,也没有到
scala.collection.mutable.Queue
的隐式转换,因此不能使用scala收集方法,如
map


注意:从2.11开始,Scala没有
Deque
接口,更不用说
ArrayDesign
实现了。

除此之外,Scala还有一个和一个实现。@Ashalynd非常感谢。我正在使用remove,但由于我的程序停止拾取元素,我想可能是Arraybuffer背后的原因。它正在读取二进制图像中的一行。这是一条连续的线,但它会在某个点停止@Rubbic仍然不明白为什么你对这个数组着迷,想把它用作队列。您是否对队列过敏,或者您有更好的动机?谢谢,但我的程序中需要一些功能,以便使用arraybuffer时更加自信。因为我和你们谈过并尝试了不同的方法,我决定将我的搜索算法改为DFS以使用堆栈,我们在Scala中有这样的东西吗,还是我应该自己实现它?