【问题标题】:clear() impl in Java's LinkedListJava 的 LinkedList 中的 clear() impl
【发布时间】:2010-10-09 05:26:22
【问题描述】:

我担心这是一个非常愚蠢的问题,但这里是:

为什么 Java 的默认 LinkedList 实现中的 clear 方法会费力地遍历列表并解开所有节点?为什么不直接解开标题并让列表的其余部分保持连接 - GC 无论如何都会得到它,不是吗?

方法如下:

/**
 * Removes all of the elements from this list.
 */
public void clear() {
    Entry<E> e = header.next;
    while (e != header) {
        Entry<E> next = e.next;
        e.next = e.previous = null;
        e.element = null;
        e = next;
    }
    header.next = header.previous = header;
    size = 0;
modCount++;
}

为什么要走路呢?为什么不直接跳到header.next = header.previous = header;

我能想到的最好的结果是它对 GC 有帮助吗...?这个链接http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#997442 有点暗示。

TIA...

【问题讨论】:

    标签: java linked-list


    【解决方案1】:

    java.util.LinkedList 的源代码http://developer.classpath.org/doc/java/util/LinkedList-source.html 建议您可以简单地将第一个和最后一个元素设置为空。

    当然,如果你倾向于过度保护,你可以循环遍历整个事情。我个人认为,如果您的列表包含数千个元素,这可能是一项非常昂贵的任务。

    【讨论】:

      【解决方案2】:

      我只是在我的游戏开发博客上推测这个问题。感谢您的回答。我认为节点暴露是一个有问题的设计余量。列表上的替代视图(迭代器等)将依赖节点取消链接来快速失败,这也是粗略的。与其依赖这种副作用行为,列表上的子视图应该检查修改计数。无论如何,我明白他们为什么现在坚持下去了。

      【讨论】:

        【解决方案3】:

        IIRC,这是在 JDK6 中进行的一项更改,以帮助某些(世代)GC 算法的性能。通常,List 本身和较旧的节点将比其他一些节点位于较旧的一代中。年轻代会被更频繁地收集,结果年轻节点在发现所有节点都是垃圾之前就被复制了。

        所以这是一个小的性能优化。内存性能优化有点奇怪,因为通常不是导致问题的代码需要额外的时间来执行。

        【讨论】:

          【解决方案4】:

          他们的方法确保即使其他代码仍然持有对特定节点的引用,其他节点也会被 GC'ed。

          否则,即使是对其中一个节点的单个外部引用也会阻止整个链被收集。

          此外,列表中的其他操作可能同时进行(例如,通过 subList()Collections.unmodifiableList() 进行的查看、迭代器),这确保了这些操作会立即将列表视为“空”。

          【讨论】:

          • 我完全不同意,说外部代码无法获得对 LinkedList$Entry 的引用...但间接通过 LinkedList$ListItr 你肯定可以...谢谢,很好!
          • 什么会持有一个节点?一个 Iterator 或 subList,但这些都是无效的,所以不值得保留。
          • @Tom:如果您不这样做,那么 subList 和 Iterator 将继续工作,但集合框架会尝试快速失败(但不能保证)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-05
          • 1970-01-01
          相关资源
          最近更新 更多