java - 为什么 java.util.Arraylist#clear 是按照它在 OpenJDK 中的方式实现的?

标签 java performance openjdk

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#473

public void clear() {
    modCount++;

    // Let gc do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}

我的问题是,为什么他们必须通过支持数组 { O(n) } 进行循环以使每个元素符合垃圾回收条件,而他们本可以重新初始化支持数组,丢弃对整个数组的引用整个 { O(1) } 并使其符合垃圾收集条件? clear() 的 O(n) 性能对我来说似乎不太好,还是我遗漏了什么?

最佳答案

按照他们的方式进行操作可以让您重用阵列而无需重新分配其后备存储。如果您想重新分配数组,您可以自己完成,因为 ArrayList 的表示主要由其后备存储组成。

如果他们将数组作为一个整体发布,那么调用 clear() 和重新分配 ArrayList 本身之间的区别就很小了。现在,他们为您提供了一个选项,让您可以选择重新使用阵列还是用全新的阵列替换它。

关于java - 为什么 java.util.Arraylist#clear 是按照它在 OpenJDK 中的方式实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18232601/

相关文章:

java - System.out.println 默认是线程安全的吗?

makefile - 构建 OpenJDK 时的困惑参数

java - 尽管设置正确,@Autowired @Service Bean 为空

java - (Java) 在运行时动态创建新的 REST Web 服务

iPhone - 如何阻止 UIWebView 绘制/更新其内容

java - Linux/OpenJDK/冰茶 : debugging browser-hosted applet

java - 将jhipster后端和前端分成两个项目?

java - 在java中解析货币字符串

linux - 哪些性能事件可以使用 PEBS?

c++ - std::vector 推速?