String在Java里是比较特殊的类型,因为它有一种用得最普遍的特殊的实例化方法:String s = "some string";
这种初始化方法和 String s = new String("some string") 并不是等效的,后者不但效率低,而且会重复创建对象。
对于String来说,最好最直接的方法是用字符串直接量构造,不但是因为语法上方便,还有一点很重要的是:对于相同的字符串直接量,系统给我们返回的是同一个String对象。相当于系统提供了缓存来维护String类的每个对象,合理使用可以使我们少创建重复的对象。
结果是:true
并且对于Integer、Long、String这样的不可变类,直接量构造都要比用“new”构造好得多,这些类的构造函数其实都是对象复制的过程,与其说“new”,还不如说“clone“。
ps:
记得经常有个面试题这么问:
String s = new String("xxxxxx") 创建了几个对象?
答案是2个,一个是系统读到"xxxxxx"的字符串直接量时在缓存里创建的对象,一个是new String()返回的clone对象。
其实可以扩散下:
String s = "xxxxxx";
String s2 = "xxxxxx"; 创建了几个对象?
答案是一个
还有:
String s = new String("xxxxxx")
String s1 = new String("xxxxxx") 创建了几个对象?
别说是4个,而是3个~~~~