在Java中创建字符串时,这两者之间有什么区别?
String test = new String();
test = "foo";
和
String test = "foo";
何时需要使用关键字new?还是这两个基本相同,并且它们都创建了一个新的String对象?
答案 0 :(得分:4)
在第一个代码段中,创建一个新的空字符串,然后立即用字符串文字覆盖它。您创建的新字符串将丢失,最终将被垃圾回收。
创建它是没有意义的,您应该只使用第二个片段。
答案 1 :(得分:0)
new String()
将使用自己的身份哈希码创建对象字符串的新实例。当创建类似String string = "myString";
的字符串时,Java会尝试通过搜索已经创建的字符串来重用该字符串,以查找确切的字符串。如果找到,它将返回与此字符串相同的身份哈希码。这将导致,如果您创建例如字符串的身份哈希码,您将获得相同的值。
示例:
public class Stringtest {
public static void main(String[] args) {
final String s = "myString";
final String s2 = "myString";
final String otherS = new String("myString");
//S and s2 have the same values
System.out.println("s: " + System.identityHashCode(s));
System.out.println("s2: " + System.identityHashCode(s2));
//The varaible otherS gets a new identity hash code
System.out.println("otherS: " + System.identityHashCode(otherS));
}
}
在大多数情况下,您不需要创建字符串的新对象,这会导致在使用例如HashMap
或类似的东西。
因此,仅在真正需要时使用new String
创建新字符串。通常使用String yourString = "...";
。
答案 2 :(得分:0)
这是一个示例程序,可帮助您了解字符串在Java中的工作方式。
import java.util.Objects;
public class TestStrings {
public static void main(String[] args) {
String test = new String();
System.out.println("For var test value is '"+ test+ "' and object identity is "+ System.identityHashCode(test));
test = "foo";
System.out.println("For var test after reassignment value is '"+ test+ "' and object identity is "+ System.identityHashCode(test));
String test2 = "foo";
System.out.println("For var test2 value is '"+ test2+ "' and object identity is "+ System.identityHashCode(test2));
String test3 = new String("foo");
System.out.println("For var test3 value is '"+ test3+ "' and object identity is "+ System.identityHashCode(test3));
}
}
运行此命令,以查看为变量test
,test2
和test3
打印的身份哈希代码会发生什么情况。
基本上,Java尝试优化将字符串创建为文字时如何创建字符串。 Java尝试维护一个字符串池,如果再次使用相同的文字,它将使用该字符串池中的相同对象。可以这样做是因为java中的字符串是不可变的。
您可以在这个问题What is Java String interning?
上进一步阅读