-
第一种情况
String str1 = new String(“abc”); String str2 = new String(“abc”); 这两个声明,代表存在两个对象,内容相同,但是内存地址不同,即在堆中的位置不同。只要用new总会生成新对象。
-
第二种情况
String str1 = “abc”; String str2 = “abc”; 在JVM存在一个字符串池,里面保存很多String对象,并且可以被共享使用,str1,str2引用的是同一个String对象。
String内部的机制:
-
关于常量池
String的实现采用了Flyweight(享元)的设计模式,当创建一个字符串常量时,首先在字符串常量池中查找是否已经有相同的字符串被定义,判断依据是equals(Object object)方法。若已经定义,获取对其的引用,不需要创建新的对象;如果不存在,首先创建这个对象,然后加入到字符串常量池中,再将它的引用返回;
-
关于堆
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
这是String类的构造方法。 当new String(“abc”)时,首先判断常量池中是否有“abc”,如果没有,则创建对象,加入到常量池中,然后将常量池的“abc”作为String构造方法的参数,创建新的“abc”String对象;如果有,那么直接创建“abc”String对象,参数时常量池中的“abc”对象。