Java Array列表的trimToSize()方法是多余的吗?

use*_*360 3 java arraylist

我认为trimToSize()Java的ArrayList中的方法是不必要的.我的理解是:

我们来看一个整数数组:

int[] a = new int[10]; //This allocates ten free slots proactively.
Run Code Online (Sandbox Code Playgroud)

ArrayList的主要优点是它可以在运行时动态创建数组,从而节省内存.现在代码 ArrayList<Integer> arl = new ArrayList<Integer>(10);不会主动分配十个空闲插槽; 相反,只有在存储数据时才添加插槽.

现在Java规范说trimToSize()将从ArrayList中删除未使用的空间,但根据我的理解,ArrayList中不会有任何未使用的空间,因为只有在数据可用时才创建空间,并且当数据可用时,未使用或可用空间将为零.

Hov*_*els 8

你的理解是不正确的.如果你创建了一个new ArrayList<Integer>(10),它将创建一个大小为10的整数数组,在ArrayList中填充空值作为其数据模型的核心.它将根据项目数填充部分或全部插槽,如果项目数超过其可能大小的数量,它将增加基础数组的大小.该trimToSize()方法具有相关性.

  • @ user1613360:[这是Java 7版本的源代码.](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/ArrayList.java #ArrayList.%3Cinit%3E%28int%29)阅读它,你会发现它确实分配了10个插槽. (2认同)

Jer*_*vel 5

冗余:没有.有用?仅在非常具体的情况下.

您应该知道的是,ArrayList当填充一定比例的元素时,会增加后备阵列.

[之前站在这里的是用于a Map,而不是ArrayList]

ArrayList每次添加项目时都会在内部检查是否应调整后备阵列的大小:

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
}

private void ensureCapacityInternal(int minCapacity) {
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    elementData = Arrays.copyOf(elementData, newCapacity);
}
Run Code Online (Sandbox Code Playgroud)

我遗漏了一些主要是边界检查的东西.因此,您可以看到:当空间不足以添加项目时,它将创建一个1.5倍于前一个数组的新数组,并将所有项目添加到其中.对于10个项目的初始值,它将立即到达15个项目.

将其推断为更高的值,您可以看到,当您可能完成添加项目时,您突然开始分配数千个空数组条目.

同样,删除值可能会导致1000万个元素的后备数组缩小为10个元素.当你只需要十几个时,分配几百万个数组条目是相当浪费的.