正如标题所提到的,如果我创建一个初始容量为500的ArrayList,并在一段时间后清除它,它的容量仍然是500?或者我需要重新初始化它?清理ArrayList是否保留其容量
1
A
回答
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;
}
}
相关问题
- 1. NSUndoManager是否保留其参数?
- 2. 是否有理由保留SVN分支?
- 3. 画布:清除矩形但保留内容的其余部分
- 4. 清除ArrayList容器
- 5. 支持保留容量
- 6. 使用变量调用块是否保证其生命周期将保留?
- 7. 在ArrayList中保留项目
- 8. 是否将autorelease对象分配给保留属性会增加其保留数?
- 9. 保留UITouch:是否允许?
- 10. NSUndoManager是否保留对象?
- 11. Viewstate是否保留历史
- 12. [NSStream scheduleInRunLoop:forMode:]是否保留NSStream?
- 13. NSTimer是否自动保留?
- 14. 不[UIWindow addSubView:]是否保留?
- 15. control-b:是否保留?
- 16. [UIColor colorWithPatternImage:]是否保留UIImage?
- 17. CALayer为什么不保留其内容?
- 18. 在其容器内保留固定格
- 19. 如何保留子div相对于其容器的偏移量
- 20. 如何确保Flex div的内容保留在其容器内?
- 21. 无法理清一个ArrayList
- 22. 正确清理java arraylist
- 23. 保留容量是否会产生两个分配或只有一个分配?
- 24. 全局变量不保留其值
- 25. 变量保留其值的问题
- 26. nodejs/JavaScript变量保留其旧值?
- 27. 实例变量不保留其值
- 28. VB.NET中的变量在页面事务之间保留其值是否正常?
- 29. 如何清除其内容的变量
- 30. Objective-C的保留澄清