1. String的两个构造函数
private final char value[]; private int hash; public String() { this.value = "".value; }
public String(String original) { this.value = original.value; this.hash = original.hash; }
2. new String中创建几个String对象?
1)创建两个String对象
public static void main(String[] args) { String y = new String("hello"); }
内存模型如下:
2)创建一个String对象
public static void main(String[] args) { String x = "hello"; String y = new String("hello"); }
内存模型如下:
3. String的intern方法
String类私有地维护着一个初始为空的字符串池,当调用intern方法时:
1. 若字符串池中已包含一个等于此String对象的字符串(用 equals方法确定),则返回池中的字符串。
2. 否则,将此String对象添加到池中,并返回此String对象的引用。
public native String intern();
字符串池中存放的是String对象引用,而不是String对象本身。
实验:
public static void main(String[] args) { String x = "hel"; x += "lo"; String y = "ja"; y += "va"; System.out.println(x == x.intern()); // true System.out.println(y == y.intern()); // false }
y == y.intern()为false说明字符串池中已存在"java",JVM启动时在字符串池中加载的字符串还包括:"true"、"false"...
内存模型:
intern前
intern后