gpt4 book ai didi

java - 本地字符串扫描器何时进行垃圾收集?

转载 作者:行者123 更新时间:2023-12-01 11:57:26 24 4
gpt4 key购买 nike

假设我有一个 String s,我想使用扫描仪通过构建器内的此方法来迭代它:

private void scan(String s){    
Scanner scanner = new Scanner(s);
while (scanner.hasNext()){
//do something
}
}

假设 s 是一个变量,是另一个对象的一部分。

public class Person{
String name;
//rest of code
}

现在假设这个对象存储在 Singleton 中,该 Singleton 存储的数据在程序的生命周期中随时可用

public class Singleton{
private List<Person> list = new ArrayList<>();
//rest of code
}

我的问题是:一旦 scan(String s) 运行完毕,scanner 会发生什么?它会继续存在,还是会在达到其范围后被收集,从而释放资源?如果没有被收集,如果我将 scan(String s) 更改为:

,会发生什么情况
private void scan(String s){    
Scanner scanner = new Scanner(s);
while (scanner.hasNext()){
//do something
}
scanner.close();
}

还是应该首选后一种形式?

最佳答案

如果 Scanner 位于 String 上,则 Scanner 将以 StringReader 作为其源,该源将引用字符串,但不是扫描仪本身。由于 StringReader 纯粹位于内存中,因此不需要关闭或清理。不过,关闭它并没有什么坏处,但如果您确实选择关闭它,则应该将对 close 的调用放在 finally block 中,或者通过使用 try-with-resources 使其隐式:

Scanner scanner = new Scanner(s);
try {
while (scanner.hasNext()) {
// do something
}
} finally {
scanner.close();
}

或者:

try (Scanner scanner = new Scanner(s)) {
while (scanner.hasNext()) {
// do something
}
} // close will be implicitly called

规则是,您应该始终关闭打开的任何内容以确保资源得到清理。

对于文件上的扫描程序,关闭它很重要。

对于 System.in 上的扫描程序,您没有打开 System.in,因此您没有责任关闭它。

对于字符串上的扫描器,或者从ByteArrayInputStreamStringReader读取数据时,没有任何需要关闭的有意义的资源,但最好以调用 close 的方式编写内容,以防万一您稍后将其切换为从文件中读取(或只是为了养成习惯)。

对于您关于垃圾收集的问题,您实际上永远无法说出什么时候会进行垃圾收集。如果你的程序永远不会出现内存不足的情况,垃圾收集器甚至可能不会运行。但由于 String 和 StringReader 都没有维护对 Scanner 的引用,因此当方法 scan(字符串) 返回。

关于java - 本地字符串扫描器何时进行垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28329419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com