1

可能重复:
Java 字符串:“String s = new String(”silly“);”
Java 中“new String(…)”这个表达式的目的是什么?

有两种方法可以创建 String 对象:

1) 在 String s ="hello" 中使用字面量(创建一个对象)
2) 在 String s = new String("hello") 中使用 new (创建两个对象)

我想知道为什么我需要采用 2) 方法?

4

5 回答 5

12

如果你用 new 创建一个字符串,那么你会得到一个不同的字符串引用。这可以避免令人毛骨悚然的行为:

String s = "hello";
String t = "hello";
String u = new String("hello");
System.out.println(s==t);
System.out.println(t==u);

打印真假。我真的想不出我会在哪里使用它的真正软件。但从某种意义上说,创建新引用更“安全”,因此 == 并不会让我们感到惊讶。

于 2012-04-12T19:05:57.857 回答
4

它们之间的基本区别是内存分配。

第一个选项即

String s1 = "hello";

当您使用此s1时,它被称为字符串文字,并且 s1 的内存是在编译时分配的。

但在第二种情况下

String s2 = new String("hello");

在这种情况下,s2 被称为代表hello的 String 对象

当您尝试使用第一种情况创建两个字符串文字时,这两个文字仅引用一个内存。我的意思是字符串文字正在使用字符串池的概念。当您创建具有相同内容的第二个字符串文字时,而不是分配新的空间编译器将返回相同的引用。因此,当您使用==运算符比较这两个文字时,您会得到正确的结果。

但在第二种情况下,每次 JVM 都会为每个创建一个新对象。并且您必须使用equals()方法而不是==运算符来比较它们的内容。

如果您想使用第二种情况创建一个新的字符串对象并且您不想要一个新对象,那么您可以使用intern()方法来获取相同的对象。

String s = "hello";
String s1 = new String("hello").intern();
System.out.println(s == s1);

在这种情况下,JVM 不会创建新对象,而是返回相同的引用s。所以输出将是真实的

于 2012-04-12T19:08:43.237 回答
1

第二种方法只是一种可能。实际上从未使用过(大多数开发人员)。第一种是后者的一个不太方便的版本,没有理由使用第二种方式。

PS。第二个只是创建一个与文字不同的链接。从技术上讲,他们将重用相同的 char 数组。唯一的区别是引用会不同(即 == 将给出错误,但永远不要使用 == 进行字符串比较)。

于 2012-04-12T19:04:41.253 回答
1

唯一new String("foo")应该使用的精神健全的场合是单元测试。您可以确保代码不==用于字符串比较,而是使用正确的.equals()方法。

于 2012-04-12T19:09:48.973 回答
0

这可以理解为每个副本的构造函数。它们在 C++ 中非常常用。最终效果是具有作为参数传递的对象的副本,在本例中为字符串。

于 2012-04-12T19:10:10.533 回答