【问题标题】:method clear() in ArrayDequeArrayDeque 中的方法 clear()
【发布时间】:2018-11-01 13:13:44
【问题描述】:

为什么在ArrayDeque 中清除这个,使用 (1)do-while 删除每个元素,而不是创建具有起始大小的新数组和 (2) 覆盖包含元素的数组?

(1)

public void clear() {
    int h = head;
    int t = tail;
    if (h != t) { // clear all cells
        head = tail = 0;
        int i = h;
        int mask = elements.length - 1;
        do {
            elements[i] = null;
            i = (i + 1) & mask;
        } while (i != t);
    }
}

(2)

public void clear() {
     head = tail = 0;
     elements = null;
     elements = (T[]) Object[START_SIZE]; 
}

【问题讨论】:

  • 你是在问为什么JDK使用(1)而不是(2)?
  • 您的第二个选项将elements 缩小到初始大小,而不是保留数组的当前大小
  • 通常还值得指出的是,无论何时创建数组,all of its elements are required to be initialized to a default value。这意味着当您执行new Object[n] 时,JVM 可能会立即将所有 n 元素设置为null

标签: java collections arraydeque


【解决方案1】:

您希望在clear() 中将每个元素显式设置为null 的原因是,否则您可能会引入某种形式的内存泄漏。也就是说,elements[] 数组可以保存对对象的引用并防止它们被垃圾回收。

您可以从头开始重新创建数组的替代方法(尽管我认为您缺少new),但是分配新的内存块通常比清除已分配的内存要慢。

【讨论】:

  • @ELEVATE 我有两个问题: 1. clear() 方法在实践中可以在哪里使用?
  • @ELEVATE 2. 例如,如果我有 1000 个元素的 ArrayDeque,我需要空的 ArrayDeque,什么方法会更好?
  • @ELEVATE 还有一个: 3. 如果我按照方法 2 重写,旧数组会被垃圾收集器销毁吗?
  • 是的,如果整个阵列被替换,旧阵列将可用于垃圾回收。我总是将元素归空,因为这不需要任何内存分配。分配一个新缓冲区也会在后台用空值填充该缓冲区,因此可能不会更快。
猜你喜欢
  • 2015-04-03
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多