Java ArrayBuffer在内存中是如何工作的?
我想在我的程序中使用ArrayBuffer来保存数字列表。我想把它用作队列。每次删除列表中的第一项并使用它。然后我想知道每次我删除第一个项目时,队列中的所有其他数字都会移动一个位置。我的意思是,下次我可以再次阅读第(0)项吗?如果您查看Scala或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.
删除的实现:
/** 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中有这样的东西吗,还是我应该自己实现它?