1.== 和 equals():
(1)“==” 用于比較基本數據類型時比較的是值,用于比較引用類型時比較的是引用指向的地址。
(2)Object 中的equals() 與 “==” 的作用相同,但String類重寫了equals()方法,比較的是對象中的內容。
public boolean equals(Object anObject) { if (this == anObject) {return true;? ? }else {if (anObjectinstanceof String) {? ? ? ? ? ? ? ? String aString = (String)anObject;
? ? ?? if (this.coder() == aString.coder()) {return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value);
? ? ?? }? ? ? ? }return false;? }}
2.String對象的兩種創建方式:
(1)第一種方式:?String str1 = "aaa";??是在常量池中獲取對象("aaa" 屬于字符串字面量,因此編譯時期會在常量池中創建一個字符串對象,如果常量池中已經存在該字符串對象則直接引用)
(2)第二種方式:?String str2 = new String("aaa") ; 一共會創建兩個字符串對象一個在堆中,一個在常量池中(前提是常量池中還沒有 "aaa" 象)。
System.out.println(str1==str2);//false
3.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“
4字符串拼接:
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