String類型相關

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。