String類型細節總結

一: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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章