我正在阅读有关java最佳实践的一些建议,我得到了以下让我好奇的想法
此外,无论何时想要实例化String对象,都不要使用其构造函数,而是始终直接实例化它。
例如:
//slow instantiation
String slow = new String("Yet another string object");
//fast instantiation
String fast = "Yet another string object";
这是为什么?不是'fast'调用默认的字符串构造函数吗?
答案 0 :(得分:6)
当您使用new
时,您会获得新字符串对象,但如果您使用字符串文字,那么see here:
在计算机科学中,字符串实习是一种只存储一个的方法 每个不同字符串值的副本,必须是不可变的。实习 字符串使一些字符串处理任务更多时间或 节省空间的代价是在字符串需要更多时间 创建或实习。不同的值存储在字符串实习生中 池。每个字符串的单个副本称为“实习生”,并且是 例如,通常通过字符串类的方法查找 Java中的String.intern()。 Java中的所有编译时常量字符串都是 使用此方法自动实习。
如果你这样做:
String a = "foo";
String b = "foo";
然后a==b
是 true !
只有在没有实习的情况下,才会创建
但是使用将为每个字符串创建不同对象的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不在池中时才创建新对象。