【问题标题】:Does Clearing an ArrayList preserve its Capacity清除 ArrayList 是否保留其容量
【发布时间】:2012-11-27 10:07:14
【问题描述】:

正如标题所提到的,如果我创建一个初始容量为 500 的 ArrayList,然后在一段时间后将其清除,它的 容量 仍然是 500 吗?还是我需要为此重新初始化它?

【问题讨论】:

    标签: java arraylist capacity


    【解决方案1】:

    是的,它保留了它的容量。 (至少,不在 Oracle VM 的实现中):

    /**
     * Removes all of the elements from this list.  The list will
     * be empty after this call returns.
     */
    public void clear() {
        modCount++;
    
        // Let gc do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;
    
        size = 0;
    }
    

    要明确一点:ArrayList 由一个数组支持(例如 ArrayList 的 int[]),并且每当您通过创建新数组并复制内容而超出容量时,该数组就会扩展。清除不会(如代码所示)创建一个新的更小的数组,复制那里的东西,并销毁旧的大数组。

    【讨论】:

      【解决方案2】:

      不,如果从列表中删除元素,arrayList 的容量不会改变。但您可以使用 trimToSize 自行完成。

      一般来说,您无需担心容量会随着您添加更多元素而增加。担心容量的可能原因是由于频繁重新分配导致的性能。否则,您无需担心重新初始化容量。

      【讨论】:

        【解决方案3】:

        Capacity of ArrayList的帮助下,我发现容量没有被重置。找到示例代码:

        import java.lang.reflect.Field;
        import java.util.ArrayList;
        public class Main {
        
            public static void main(String[] args) {
                try {
                    ArrayList<Object> al = new ArrayList<Object>(500);
                    System.out.println(getCapacity(al));
                    for (int i = 0; i < 550; i++) {
                        al.add(new Object());
                    }
                    System.out.println(getCapacity(al));
                    al.clear();
                    System.out.println(getCapacity(al));
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        
            static int getCapacity(ArrayList<?> l) throws Exception {
                Field dataField = ArrayList.class.getDeclaredField("elementData");
                dataField.setAccessible(true);
                return ((Object[]) dataField.get(l)).length;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-27
          • 2016-08-29
          • 1970-01-01
          • 1970-01-01
          • 2010-11-09
          • 2012-10-19
          • 1970-01-01
          相关资源
          最近更新 更多