for(int i = 0; i < len i++) {
List<Integer> a = new ArrayList<Integer>();
a.add(1)
a.add(2)
}
有人告诉我,在此循环完成后,将释放与a
关联的内存。在循环期间,是仅为一个列表或len * listmemory分配的内存?
我的意思是在内存中使用了多少字节,比如8 * len或只是说8?
在我的项目中,列表非常庞大,所以我想知道,如果我把声明放在for循环之外,那么内存使用的用量是否比这小得多?
答案 0 :(得分:2)
您似乎正在分配len
个列表。通常,您将声明放在循环之外。另外,你已经删除了类型说明符(它会给你一个警告,你不应该忽略它们) -
List<Integer> a = new ArrayList<>(); // Or ArrayList<Integer> in Java before 1.7
for(int i=0; i < len; i++) { // <-- Missing semi-colon after len.
// List<Integer> a = new ArrayList(); // <-- define outside the loop.
a.add(1); // <-- Missing semi-colon.
}
最后,当列表a
无法再访问时,它将有资格进行垃圾回收。在Java中,您没有明确管理内存。
(编辑)在循环中创建的每个List
实例中有多少元素无关紧要,当引用无法访问时,它就有资格进行垃圾回收。什么时候(甚至是)垃圾收集会发生无保证。
内存使用情况取决于实现(但我认为默认ArrayList
大小为10)。每个Integer都是一个包含4字节整数和一些开销的包装器......也许是40位?因此,大约len * 10 * 4
个字节 - 当然垃圾收集可以在循环期间的任何时刻运行。