我试图强调从ArrayBuffer
删除元素的工作方式。这是它:
override def remove(n: Int, count: Int) {
if (count < 0) throw new IllegalArgumentException("removing negative number of elements: " + count.toString)
else if (count == 0) return // Did nothing
if (n < 0 || n > size0 - count) throw new IndexOutOfBoundsException("at " + n.toString + " deleting " + count.toString)
copy(n + count, n, size0 - (n + count))
reduceToSize(size0 - count)
}
副本实现如下:
protected def copy(m: Int, n: Int, len: Int) {
scala.compat.Platform.arraycopy(array, m, array, n, len)
}
这意味着它只是将新数组的内容复制到同一个数组 而不调整其大小 。相比之下,ArrayList
中的JDK
会调整数组大小,只要我们从中删除元素。
我的理解在哪里错了?
答案 0 :(得分:1)
reduceToSize
方法减少了我认为的数组大小。
def reduceToSize(sz: Int) {
require(sz <= size0)
while (size0 > sz) {
size0 -= 1
array(size0) = null
}
}
答案 1 :(得分:1)
对于 Java ArrayList
它还缩小 数据数组,只需设置null
GC 已移除 元素。 Scala ArrayBuffer
与ArrayList
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}