String s="Honey"与String s=new String(“Honey”)一样吗?
不一样,内存分配方式不同。String s="Honey"方式,Java VM会将其分配到常量池中;而String s=new String(“Honey”)则会被分配到堆内存中。
String的实现采用了Flyweight的设计模式,当创建一个字符串常量时,例如String s = “Honey”,会首先在字符串常量池中查找是否已经有相同的字符串被定义,判断的依据是String类equals(Object obj)方法的返回值。若已经定义,则直接获取对其的引用,此时不需要创建新的对象;若没有定义,则首先要创建好这个对象,然后把它放到字符串常量池中,再将它的引用返回。对于赋值语句String s = null;,其中s是一个字符串类型的引用,它不指向任何一个字符串。而赋值语句 String s = “”;中的s是一个字符串类型的引用,它指向另外一个字符串(这个字符串的值为"",即空字符串)。