为什么我不应该用构造函数实例化一个字符串对象?

时间:2012-06-23 23:16:08

标签: java

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

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

4 个答案:

答案 0 :(得分:9)

  

为什么?

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

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

除非您的代码需要,否则无论出于何种原因构建两个不同的实例

答案 3 :(得分:1)

  
    

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

  

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

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

s == s2 =>真