gpt4 book ai didi

java - 不是文字的字符串对象不需要 new 关键字?

转载 作者:行者123 更新时间:2023-11-29 02:59:27 24 4
gpt4 key购买 nike

所以我知道还有其他类似的问题,比如this onethis other one .但他们的回答似乎是因为它们是文字的并且是某些不可变文字常量池的一部分,所以它们将保持可用。这对我来说很有意义,但为什么非文字也能正常工作?在处理字符串时,我什么时候必须使用“new”关键字。在下面的示例中,我使用字符串来做一些事情,但一切正常,我从不使用“new”关键字(更正:我从不将它用于 String 类型对象)。

import java.util.*;

class teststrings{

public static void main(String[] args){
Scanner in = new Scanner(System.in);
String nonew;
String nonew2;
String literally= "old";
literally= "new"; //does the word "old" get garbage collected here?
nonew = in.nextLine(); //this does not use the new keyword, but it works, why?
System.out.println("nonew:"+nonew);
System.out.println("literally:"+literally);
nonew2 = in.nextLine();
System.out.println("nonew:"+nonew); //the data is still preserved here
System.out.println("nonew2:"+nonew2);
//I didn't use the new keyword at all, but everything worked
//So, when do I need to use it?
}

}

最佳答案

几点:“‘旧’这个词在这里会被收集吗?”您的编译器很可能意识到它从未被使用过,因此完全跳过它。

Scanner::nextLine返回一个String,方法返回的值用于赋值。

至于什么时候String使用new...嗯,很少可能是最好的。我唯一一次看到它被用于内部常量。例如

public class MatchChecker {
private static final String ANY_VALUE = new String("*");

private final Map<Object, String> map = new HashMap<Object, String>();

public void addMatch(Object object, String string) {
map.put(object, string);
}

public void addAnyValueMatch(Object object) {
map.put(object, ANY_VALUE);
}

public boolean matches(Object object, String string) {
if (!map.contains(object)) {
return false;
}
if (map.get(object) == ANY_VALUE || map.get(object).equals(string)) {
return true;
}
return false;
}
}

这意味着只有那些通过 addAnyValueMatch 添加的对象会匹配任何值(因为它是用 == 测试的),即使用户使用 "*" 作为 addMatch 中的字符串。

关于java - 不是文字的字符串对象不需要 new 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35965527/

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