了解Scala中的ArrayBuffer

时间:2017-07-31 09:23:58

标签: java scala

我试图强调从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会调整数组大小,只要我们从中删除元素。

我的理解在哪里错了?

2 个答案:

答案 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 ArrayBufferArrayList

几乎完全相同
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;
}