5

显然,在 Java 中,String s = "foo"优先于String s = new String("foo").

为什么?不是在这两种情况下都创建了一个新的字符串对象吗?为什么第一种情况会阻止调用构造函数?

4

4 回答 4

9

为什么?

因为第二种方法会产生两个字符串对象(原始由于字符串文字,加上显式副本)。

于 2012-06-23T23:17:43.707 回答
4

第一种情况是字符串文字,只是语言为您提供创建字符串的简写。String 类的构造函数仍然被调用,只是没有显式调用,这意味着更少的输入和更少的代码混乱。

第二种情况采用已经由文字创建的 String 对象并将其传递给构造函数,该构造函数复制内容以创建一个新的、单独的 String 对象。文字仍然存在,因为文字是被实习的。

很少有使用 String 构造函数的意义(几乎只有当您创建了一个非常大的字符串的子字符串并希望释放字符串其余部分使用的内存时,因为默认情况下子字符串使用相同的底层 char 数组作为原始字符串,只是具有不同的偏移量和长度。

于 2012-06-23T23:24:05.890 回答
1

我不认为它更可取。我假设您获得的唯一“好处”是,如果您错误地使用“==”运算符而不是 equals 方法,则字符串的两个不同实例将更快地失败,这将提示您修复代码。( == 运算符可能“成功”并意外失败)

当然,除非您的代码出于任何原因要求您构建两个不同的实例

于 2012-06-23T23:20:45.857 回答
1

为什么?不是在这两种情况下都创建了一个新的字符串对象吗?

不,作为字符串文字的初始形式将被实习,以便只创建一个实例:

String s = "foo";
String s2 = "foo";

s == s2 => 真

于 2012-06-23T23:25:10.320 回答