1. java裏的new 一個String對象時都會在堆內存裏產生一個對象。java
String str = new String("abc") 首先檢查String Pool裏有沒有值爲abc的對象,若是沒有會先在String Pool裏產生一個值爲abc的對象,而後再在堆內存裏拷貝一個值爲abc的對象,而後把堆內存裏的對象的地址賦值給str,若是String Pool裏有一個值爲abc的對象,則直接從String Pool裏的值拷貝一份值爲abc的對象到堆內存,而後把堆內存裏的對象的地址賦值給str.ide
String str = "abc' 這種方式建立的字符串,會首先看String Pool裏有沒有值爲abc的對象,若是有,則直接把String Pool裏abc對象的內存地址複製給str便可,若是沒有則在String Pool裏建立一個值爲abc的對象,而後把建立的新的對象的內存地址賦值給str便可spa
java 代碼
public class Test {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == str3);
}
}
輸出結果;
false
false
false
2. String.intern() ,返回的是String Pool裏相同值的對象的地址。code
因此:對象
java 代碼
public class Test {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str1.intern());//false
System.out.println(str2 == str2.intern());//true
System.out.println(str1.intern() == str3.intern());//true
}
}
3 字符串用+號鏈接內存
若是+號兩邊都是字面常量的話,都會先去String Pool裏找值相等的對象.若是沒有找到則會在String Pool裏建立一個新的對象。字符串
若是+號兩面有一個不是字面常量的話,則會在堆裏建立一個新的對象。it
java 代碼
public class Test {
public static void main(String[] args) {
String hello = "hello";
String lo = "lo";
System.out.println(hello == "hel" + "lo");//+號兩邊都是字面常量,會在String Pool裏建立,因此返回true
System.out.println(hello == "hel" + lo);//+號右邊不是字面常量,則會在堆內存裏建立,因此返回false
}
}