1. java裏的new 一個String對象時都會在堆內存裏產生一個對象。
String str = new String("abc") 首先檢查String Pool裏有沒有值爲abc的對象,如果沒有會先在String Pool裏產生一個值爲abc的對象,然後再在堆內存裏拷貝一個值爲abc的對象,然後把堆內存裏的對象的地址賦值給str,如果String Pool裏有一個值爲abc的對象,則直接從String Pool裏的值拷貝一份值爲abc的對象到堆內存,然後把堆內存裏的對象的地址賦值給str.
String str = "abc' 這種方式創建的字符串,會首先看String Pool裏有沒有值爲abc的對象,如果有,則直接把String Pool裏abc對象的內存地址複製給str即可,如果沒有則在String Pool裏創建一個值爲abc的對象,然後把創建的新的對象的內存地址賦值給str即可
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裏相同值的對象的地址。
所以:
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裏創建一個新的對象。
如果+號兩面有一個不是字面常量的話,則會在堆裏創建一個新的對象。
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
}
}