在java中,String可以通过以下两种方式创建
String foo="Test";
String fooobj=new String("Test");
提到这两种创建String的方式之间的区别。我想更多地了解什么是适当的场景, 我们应该去哪里
String foo="Test";
何时去
String fooobj=new String("Test"); ?
答案 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");
您应该避免使用第二种声明字符串的方式,原因可以解释为其他答案