关于String实例化的最佳实践好奇心

时间:2013-03-26 19:53:20

标签: java string instantiation

我正在阅读有关java最佳实践的一些建议,我得到了以下让我好奇的想法

此外,无论何时想要实例化String对象,都不要使用其构造函数,而是始终直接实例化它。

例如:

//slow instantiation
String slow = new String("Yet another string object");

//fast instantiation
String fast = "Yet another string object";

这是为什么?不是'fast'调用默认的字符串构造函数吗?

2 个答案:

答案 0 :(得分:6)

当您使用new时,您会获得新字符串对象,但如果您使用字符串文字,那么see here

  

在计算机科学中,字符串实习是一种只存储一个的方法   每个不同字符串值的副本,必须是不可变的。实习   字符串使一些字符串处理任务更多时间或   节省空间的代价是在字符串需要更多时间   创建或实习。不同的值存储在字符串实习生中   池。每个字符串的单个副本称为“实习生”,并且是   例如,通常通过字符串类的方法查找   Java中的String.intern()。 Java中的所有编译时常量字符串都是   使用此方法自动实习。

如果你这样做:

String a = "foo";
String b = "foo";

然后a==b true

只有在没有实习的情况下,才会创建 。 将在第一次创建对象,并将其存储在名为 String constant pool 的位置。

但是使用将为每个字符串创建不同对象的new将输出 false

String a = new String("foo");
String b = new String("foo");

现在a==b false

因此,当使用文字时,它更容易阅读,加上编译器更容易进行优化。所以..尽可能使用它。

答案 1 :(得分:1)

JVM维护一个String文字池以进行优化。使用构造函数创建String时,

String s1 = new String("foo");

创建一个新的String对象,并将文字"foo"添加到池中。在此之后,只要在代码中使用"foo""foo"就会引用池中的项目,并且不会创建新对象。由于String是不可变的,因此不会产生任何问题。

因此,当您使用“快捷方式”创建String时:

String s2 = "foo"

JVM查看池,如果"foo"已经存在,它将使s2引用池中的项目。

这是可能的性能影响的主要区别:构造函数始终创建一个对象,并将文字添加到池中(如果它尚不存在)。快捷方式是指池中的项目,仅当liuteral不在池中时才创建新对象。