我是java新手,所以这是java初学者遇到的问题。
我知道,一旦一个对象不再使用,就将其保持打开状态是不好的做法,但是我找不到一个ArrayList的例子:我看过的教程让它打开,我找不到任何东西,除了清除它删除所有项目。
我正在寻找与此等价的:
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
String userInput = sc.nextLine();
sc.close();
但是对于数组列表对象:
import java.util.ArrayList;
ArrayList<String> countries = new ArrayList<String>();
countries.add("Spain");
countries.add("China");
System.out.println(countries);
//And then something like
countries.close();
它只是ArrayList<Object>.clear()
吗?但这不会删除对象?谢谢
2条答案
按热度按时间e1xvtsh31#
使用
.clear()
将从列表中删除所有项,但看起来您想告诉垃圾收集器删除对象,据我所知,没有办法做到这一点,但是也不必担心删除对象,如果您的代码停止使用它们,垃圾收集器将简单地自动从内存中删除它们。hfsqlsce2#
我知道,一旦对象不再使用,就将其保持打开状态是不好的做法,但是我找不到ArrayList的这种示例...
让对象“打开”并不是一般(a)的“坏习惯”。
如果对象具有关联的非堆资源,则无法关闭对象可能会导致问题。最常见的示例如下:
Socket
、FileInputStream
和FileOuputStream
。Connection
、Statement
和ResultSet
对象。BufferedImage
。然而,大多数Java对象 * 不 * 有这个问题,你 * 不 * 需要“关闭”它们,事实上,大多数对象没有
close()
或dispose()
方法。ArrayList
是典型的,没有必要“关闭”或“清理”ArrayList
,只需要让垃圾收集器来清理即可。在例外情况下,清理
List
对象 * 可能 * 是明智的;例如,这样你就可以重用它。如果你需要这样做,调用clear()
方法。但是,这通常不是一个好主意,在
ArrayList
的情况下,调用clear()
可能会导致一些二阶性能问题:1.清除列表需要接触所有列表单元格,这会消耗CPU时间。
clear()
方法不会调整ArrayList
后备数组的大小,所以一个变大的回收列表将继续拥有一个大的后备数组......永远......如果你继续回收它的话。1.在大多数Java GC中,一个Java对象在经历了很多GC周期后,会被提升到“旧”代。当这种情况发生时,关联GC的成本会增加。例如,当你将一个新对象的引用赋给一个旧对象(比如我们的列表),这会导致新对象(可能还有附近的对象)在下一个新的空间收集中没有被收集;即延长了其寿命。
简而言之,
clear()
可能对性能不利。小心好的/最好的/坏的实践建议。很多建议都是“万金油”。即使在最好的时候,大多数这样的建议也不是普遍适用的。喜欢回复所谓的“最佳实践”建议(或提供建议!)的人应该读一读这篇文章: