Java中String兩種不一樣建立方式的區別及intern的用法

一,對象

Java有兩種建立字符串的方式,內存

String str1 = "abc";
        String str2 = new String("abc");

用雙引號建立和用new來建立。這兩種方式建立出來的String存儲的位置上不一樣的。當使用雙引號方式時,至關於顯式的聲明瞭字符串的值(字面值),因此是做爲一個常量,存儲在方法區的常量池中。使用new方式來建立String時,JVM會在堆上分配一塊區域,存儲一個String對象,值爲「abc」。字符串

二,方法

String的==和equals是不一樣的,==比較的是兩個String在內存中的地址是否相同,equals比較的是兩個String的值是否相同。因此,若是String是用雙引號方式建立,則兩個String都指向常量池中的同一個位置,這時==是成立的,equals也成立。若是String是用new方式建立的,兩個String若是不是指向堆上的同一個String對象,則==不成立,而若是值相同,則equals成立。如:im

複製代碼

String str1 = "abc";
        String str2 = new String("abc");
        String str3 = "abc";
        String str4 = str2;
        System.out.println(str1 == str3);//true
        System.out.println(str1.equals(str3));//true
        System.out.println(str2 == str3);//false
        System.out.println(str2.equals(str3));//true
        System.out.println(str2 == str4);//true, str4和str2指向同一個對象
        System.out.println(str2.equals(str4));//true

複製代碼

三,img

兩種不一樣方式建立的字符串,在進行運算時結果是不一樣的。若是一個String是由兩個常量運算獲得的,至關於用雙引號建立出來,會存入常量池,如:字符

String s = "a" + "b";
        String t = "ab";
        //以上兩種建立方式,徹底等價

若是運算時,等號右邊有一個「運算數」不爲常量(即便該「運算數」是用雙引號建立的常量),則獲得的結果至關於new建立的一個新的String對象,如:new

複製代碼

String str1 = "abc";
        String str2 = "abcd";
        String str3 = "abc" + "d";
        String str4 = str1 + "d";
        
        System.out.println(str2 == str3);//true
        System.out.println(str2.equals(str3));//true
        System.out.println(str2 == str4);//false
        System.out.println(str2.equals(str4));//true

複製代碼

四,intern()方法的用法。intern方法會返回一個字符串對應的常量值。在執行intern方法時,JVM會檢查常量池中是否存在和該字符串相同的常量值,若是有,則返回該常量值,若沒有,則建立該常量值,並返回。即,intern返回的是值常量池中的String,不是堆上的String,至關於用雙引號建立String。ab

複製代碼

String str1 = "abc";
        String str2 = "abcd";
        String str3 = "abc" + "d";
        String str4 = (str1 + "d").intern();
        
        System.out.println(str2 == str3);//true
        System.out.println(str2.equals(str3));//true
        System.out.println(str2 == str4);//true
        System.out.println(str2.equals(str4));//true
     //注意和上例的區別

複製代碼

相關文章
相關標籤/搜索