字符串文字与Java中的String对象

时间:2012-04-19 07:49:30

标签: java string

在java中,String可以通过以下两种方式创建

  1. String foo="Test";
  2. String fooobj=new String("Test");
  3. 提到这两种创建String的方式之间的区别。我想更多地了解什么是适当的场景, 我们应该去哪里

      String foo="Test";
    

    何时去

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

6 个答案:

答案 0 :(得分:11)

简短回答:如果您有任何疑问,请不要new String("literal here")。如果你需要它,你就会知道你需要它,以及为什么。

答案很长:

基本上,您唯一想要使用new String("literal here")的时间是,如果您想确保生成的字符串对象不是==任何其他字符串对象。文字自动获得interned;通过new String("literal here")创建的字符串不是。

那你为什么要这样呢?答案是你几乎永远不会,因为String实例是不可变的,所以你不在乎你是否与其他东西共享一个String实例。我能想象的唯一场景是,如果你有一个接受String的API而你想要一个除null之外的标志值,你想通过{检查那个标志/标记值{1}},像这样:

==

......即便如此,我也会发现它有点怀疑,并会探索其他方法。

答案 1 :(得分:7)

使用

创建新的String对象需要永远
String fooobj = new String("Test");

所以,你永远不应该这样做。只需改为编写String fooobj = "Test";

Class String是不可变的。这意味着String对象的内容在构造之后无法更改。永远不必创建字符串文字的显式副本。

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

String对象和字符串文字之间存在细微差别。

String s =" abc&#34 ;; //创建一个String对象和一个引用变量 在这个简单的例子中," abc"将进入游泳池并且s将参考它。

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

答案 5 :(得分:-2)

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

     String str = "abc";

相当于:

     String str = new String("abc");

您应该避免使用第二种声明字符串的方式,原因可以解释为其他答案