一:String對象的兩種創建方式:
(1)第一種方式: String str1 = “aaa”; 是在常量池中獲取對象(“aaa” 屬於字符串字面量,因此編譯時期會在常量池中創建一個字符串對象,如果常量池中已經存在該字符串對象則直接引用)
(2)第二種方式: String str2 = new String(“aaa”) ; 一共會創建兩個字符串對象一個在堆中,一個在常量池中(前提是常量池中還沒有 “aaa” 象)。
System.out.println(str1==str2);//false
二:String類型的常量池比較特殊。它的主要使用方法有兩種:
(1)直接使用雙引號聲明出來的String對象會直接存儲在常量池中。
(2)如果不是用雙引號聲明的String對象,可以使用 String 提供的 intern 方法。 String.intern() 是一個 Native 方法,它的作用是: 如果運行時常量池中已經包含一個等於此 String 對象內容的字符串,則返回常量池中該字符串的引用; 如果沒有,則在常量池中創建與此 String 內容相同的字符串,並返回常量池中創建的字符串的引用。
String s1 = new String(“AAA”);
String s2 = s1.intern();
String s3 = “AAA”;
System.out.println(s2);//AAA
System.out.println(s1 == s2); //false,因爲一個是堆內存中的String對象一個是常量池中的String對象
System.out.println(s2 == s3);//true, s1,s2指向常量池中的”AAA“
三:字符串拼接:
String a = “a”;
String b = “b”;
String str1 = "a" + "b";//常量池中的對象
String str2 = a + b; //在堆上創建的新的對象
String str3 = "ab";//常量池中的對象
System.out.println(str1 == str2);//false
System.out.println(str1 == str3);//true
System.out.println(str2 == str3);//false
四:== 和 equals():
(1)“” 用於比較基本數據類型時比較的是值,用於比較引用類型時比較的是引用指向的地址。
(2)Object 中的equals() 與 “” 的作用相同,但String類重寫了equals()方法,比較的是對象中的內容。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}