为什么要使用new创建String对象

时间:2012-04-12 19:04:11

标签: java string

  

可能重复:
  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”)(创建两个对象)

我想知道为什么我需要采取方法?

5 个答案:

答案 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。