private final char value[]; private int hash; public String() { this.value = "".value; }
public String(String original) { this.value = original.value; this.hash = original.hash; }
public static void main(String[] args) { String y = new String("hello"); }
內存模型以下:java
public static void main(String[] args) { String x = "hello"; String y = new String("hello"); }
內存模型以下:this
String類私有地維護着一個初始爲空的字符串池,當調用intern方法時:spa
1. 若字符串池中已包含一個等於此String對象的字符串(用 equals方法肯定),則返回池中的字符串。
2. 不然,將此String對象添加到字符串池中,並返回池中的字符串。code
public native String intern();
字符串池中存放的是String對象的引用,而非String對象自己。對象
實驗:blog
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 }
結論:字符串池中已包含一個等於"java"的字符串(JVM啓動後在字符串池中加載的字符串還包括:"true"、"false"...)內存
內存模型以下:字符串
intern()前hash
intern()後io