3

在java中,可以通过以下两种方式创建字符串

  1. String foo="Test";
  2. String fooobj=new String("Test");

到处都提到了这两种创建字符串的方法之间的区别。我想更多地了解什么是合适的场景,我们应该去哪里

  String foo="Test";

什么时候去

 String fooobj=new String("Test");  ?
4

6 回答 6

11
于 2012-04-19T07:53:36.747 回答
7

永远不需要创建一个新的 String 对象

String fooobj = new String("Test");

所以,你永远不应该这样做。改写就String fooobj = "Test";行了。

String 类是不可变的。这意味着 String 对象的内容在构造后无法更改。从来没有必要创建字符串文字的显式副本。

于 2012-04-19T07:53:06.190 回答
3

你永远不应该使用new String(). 每当您以这种方式创建字符串时,都会在内存中创建新对象。如果您编写String s = "aaa",那么有可能已经在给定的 JVM 中创建了这样的对象,它存储在字符串池中,并且由于您的变量将只是引用该现有对象 - 您以这种方式保护内存。

于 2012-04-19T07:53:38.190 回答
0

当您使用第二种方法时,您实际上依赖第一种方法来初始化构造函数参数。

所以问题是如果您可以通过第一种方法创建 String 对象,为什么要花费额外的精力来使用第二种方法?

我看不到使用第二种构造函数样式的任何场景,因此始终坚持使用第一种方法。

于 2012-04-19T08:03:35.893 回答
0

字符串对象和字符串字面量之间存在细微差别。

字符串 s = "abc"; // 创建一个 String 对象和一个引用变量 在这个简单的例子中,“abc”将进入池中,s 将引用它。

字符串 s = new String("abc"); // 创建两个对象,一个引用变量 在这种情况下,因为我们使用了 new 关键字,Java 将在普通(非池)内存中创建一个新的 String 对象,s 将引用它。此外,文字“abc”将被放入池中。

于 2015-02-06T15:59:13.087 回答
-1

字符串是常量;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为 String 对象是不可变的,所以它们可以被共享。例如:

     String str = "abc";

相当于:

     String str = new String("abc");

由于其他答案中解释的原因,您应该避免使用第二种方式来声明字符串

于 2012-04-19T07:52:47.580 回答