2012-11-27 32 views
1

正如标题所提到的,如果我创建一个初始容量为500的ArrayList,并在一段时间后清除它,它的容量仍然是500?或者我需要重新初始化它?清理ArrayList是否保留其容量

回答

2

是的,它保留了它的容量。 (至少不是在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由数组支持(如int []为ArrayList的),只要你去了该数组扩展通过创建一个新的数组并复制东西来创建容量。清算不会(如代码所示)创建一个新的更小的数组,在那里复制东西,并摧毁旧的大数组。

1

不,如果您从列表中删除元素,arrayList的容量不会更改。但你可以自己使用trimToSize

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

1

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; 
    } 
}