可能重复:
Java Strings: “String s = new String(”silly“);”
What is the purpose of the expression “new String(…)” in Java?
创建String对象有两种方法:
1)在String中使用literal s =“hello”(创建一个对象)
2)在String中使用new s = new String(“hello”)(创建两个对象)
我想知道为什么我需要采取方法?
答案 0 :(得分:12)
如果使用new创建字符串,则会获得不同的String引用。这可以避免令人毛骨悚然的行为:
String s = "hello";
String t = "hello";
String u = new String("hello");
System.out.println(s==t);
System.out.println(t==u);
打印true,false。我真的不能想到我会使用它的软件。但从某种意义上说,创建新引用“更安全”,因此==并不会让我们感到惊讶。
答案 1 :(得分:5)
它们之间的基本区别是内存分配。
第一个选择,即
String s1 = "hello";
当您使用此 s1 被称为字符串文字时,s1的内存将在编译时分配。
但在第二种情况下
String s2 = new String("hello");
在这种情况下,s2被称为表示 hello
的String对象当您尝试使用第一种情况创建两个字符串文字时,这两个文字只引用一个内存。我的意思是字符串文字正在使用字符串池的概念。当您创建具有相同内容的第二个字符串文字时,而不是分配新的空间编译器将返回相同的引用。因此,当您使用 == 运算符比较这两个文字时,您将获得 true 。
但在第二种情况下,JVM每次都会为每个创建一个新对象。你必须使用 equals()方法比较它们的内容,而不是 == 运算符。
如果您想使用第二种情况创建一个新的字符串对象,并且您不想要一个新对象,那么您可以使用 intern()方法来获取相同的对象。
String s = "hello";
String s1 = new String("hello").intern();
System.out.println(s == s1);
在这种情况下,JVM不会创建新对象,而是返回相同的引用 s 。因此输出将 true
答案 2 :(得分:1)
仅精神上理智的场合,new String("foo")
应该使用单位测试。您可以确保代码不使用==
进行字符串比较,但使用正确的.equals()
方法。
答案 3 :(得分:0)
第二种方法只是一种可能性。实际上从未使用过(大多数开发人员)。第一个是后者的一个不太方便的版本,没有理由使用第二种方式。
PS。第二个只是创建一个不同的文字链接。从技术上讲,他们将重用相同的char数组。唯一的区别是引用会有所不同(即==会给出错误,但绝不能使用==进行字符串比较)。
答案 4 :(得分:0)
这可以理解为每个副本的构造函数。它们在C ++中非常常用。最终结果是作为参数传递的对象的副本,在本例中为String。