String foo = "Test";
String fooobj = new String("Test");
String foo="Test";
何时选择使用
String fooobj=new String("Test"); ?
String foo = "Test";
String fooobj = new String("Test");
String foo="Test";
何时选择使用
String fooobj=new String("Test"); ?
new String("literal here")
。如果你需要它,你会知道你需要它和为什么需要它。new String("literal here")
。字面量会自动进行interned处理;通过new String("literal here")
创建的字符串则不会。String
实例是不可变的,所以你不必担心是否与其他东西共享String
实例。我能想象到的唯一场景是,如果你有一个接受String
的API,并且你想要一个除null
以外的标记值,并且你想通过==
检查该标记值,就像这样:public static final String MARKER = new String("Marker");
public void someFictionalMethod(String arg) {
if (arg == MARKER) {
// Take action on the marker
}
else {
// Take action on the string
}
}
即使如此,我仍然会觉得有些可疑,并会探索其他方法来完成它。
使用字符串时,不必每次都创建一个新的字符串对象。
String fooobj = new String("Test");
因此,你永远不应该这样做。只需编写 String fooobj = "Test";
即可。
String类是不可变的。这意味着在构造了String对象之后,其内容无法更改。在使用字符串字面值时,不需要创建显式副本。
您永远不应该使用new String()
来创建字符串。每次以这种方式创建字符串时,都会在内存中创建一个新对象。如果您编写String s = "aaa"
,则有可能在给定的JVM中已经创建了这样的对象,它存储在字符串池中,因此您的变量将只是对该现有对象的引用-通过这种方式可以节省内存。
当你使用第二种方法时,实际上依赖于第一种方法来初始化构造函数的参数。
那么问题是,如果你可以通过第一种方法创建String对象,为什么要费额外的力气使用第二种方法呢?
我没有看到任何场景需要使用第二种构造函数样式,所以始终坚持使用第一种方法。
String 对象和字符串字面值之间有微妙的差别。
String s = "abc"; // 创建一个 String 对象和一个引用变量 在这个简单的情况下,“abc”将进入池中,s 将引用它。
String s = new String("abc"); // 创建两个对象和一个引用变量 在这种情况下,因为我们使用了 new 关键字,Java 会在正常(非池)内存中创建一个新的 String 对象,并且 s 将引用它。此外,字面值“abc”将被放置在池中。
字符串是常量,一旦创建后其值就不能被改变。字符串缓冲区支持可变字符串。由于字符串对象是不可变的,因此它们可以被共享。例如:
String str = "abc";
等同于:
String str = new String("abc");
你应该避免使用第二种方式声明字符串,原因在其他答案中已经解释过了。
String str = "abc";
等同于String str = new String("abc");
,这是完全错误的。 - T.J. Crowder