字符串是Java中的对象,那么为什么我们不使用"new"来创建它们呢?

gir*_*iri 101 java string core new-operator

我们通常使用new关键字创建对象,例如:

Object obj = new Object();
Run Code Online (Sandbox Code Playgroud)

字符串是对象,但我们不使用new它们来创建它们:

String str = "Hello World";
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我可以用一个字符串new吗?

dan*_*ben 127

除了已经说过的内容之外,Java中的字符串文字 [即,字符串"abcd"但不喜欢new String("abcd")]被实现 - 这意味着每次引用"abcd"时,您都会获得对单个String实例的引用,而不是新实例每一次.所以你将拥有:

String a = "abcd";
String b = "abcd";

a == b; //True
Run Code Online (Sandbox Code Playgroud)

但如果你有

String a = new String("abcd");
String b = new String("abcd");
Run Code Online (Sandbox Code Playgroud)

那么它有可能

a == b; // False
Run Code Online (Sandbox Code Playgroud)

(如果有人需要提醒,总是.equals()用来比较字符串; ==测试物理平等).

实习字符串文字很好,因为它们经常被使用多次.例如,考虑(设计)代码:

for (int i = 0; i < 10; i++) {
  System.out.println("Next iteration");
}
Run Code Online (Sandbox Code Playgroud)

如果我们没有字符串实习,那么"下一次迭代"需要实例化10次,而现在它只会被实例化一次.


Jam*_*dle 31

字符串是Java中的"特殊"对象.Java设计人员明智地决定使用Strings,以至于他们需要自己的语法和缓存策略.当你通过说:

String myString = "something";
Run Code Online (Sandbox Code Playgroud)

myString是对String对象的引用,其值为"something".如果你以后声明:

String myOtherString = "something";
Run Code Online (Sandbox Code Playgroud)

Java非常聪明,可以确定myString和myOtherString是相同的,并将它们作为同一个对象存储在全局String表中.它依赖于您无法修改字符串来执行此操作的事实.这样可以降低所需的内存量,并可以更快地进行比较.

相反,如果你写的话

String myOtherString = new String("something");
Run Code Online (Sandbox Code Playgroud)

Java将为您创建一个全新的对象,与myString对象不同.

  • 夸张已经眩晕,队长:) (12认同)

Cro*_*ode 16

String a = "abc"; // 1 Object: "abc" added to pool

String b = "abc"; // 0 Object: because it is already in the pool

String c = new String("abc"); // 1 Object

String d = new String("def"); // 1 Object + "def" is added to the Pool

String e = d.intern(); // (e==d) is "false" because e refers to the String in pool

String f = e.intern(); // (f==e) is "true" 

//Total Objects: 4 ("abc", c, d, "def").
Run Code Online (Sandbox Code Playgroud)

希望这清除了一些疑虑.:)


Mal*_*ist 6

这是捷径.它原本不是那样,但Java改变了它.

这个FAQ简要介绍了它.Java规范指南也讨论了它.但我无法在网上找到它.

  • 断开的链接,我不知道有任何其他证据表明它曾被改变过. (2认同)
  • @EJP它仍然在[wayback machine](http://web.archive.org/web/20130423122845/http://www.codestyle.org/java/faq-Strings.shtml#stringconstructor)中,如果有用的话。 (2认同)

Bri*_*new 6

字符串需要进行一些优化(因为缺少更好的短语).请注意,String也有运算符重载(对于+运算符) - 与其他对象不同.所以这是一个特例.


Job*_*ews 5

我们通常使用String文字以避免创建不必要的对象。如果我们使用new运算符创建String对象,那么它将每次都创建新对象。

例:

String s1=“Hello“;
String s2=“Hello“;
String s3= new String(“Hello“);
String s4= new String(“Hello“);
Run Code Online (Sandbox Code Playgroud)

对于内存中的上述代码:

在此处输入图片说明