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成立。如:

        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

三,

兩種不同方式創建的字符串,在進行運算時結果是不同的。如果一個String是由兩個常量運算得到的,相當於用雙引號創建出來,會存入常量池,如:

        String s = "a" + "b";
        String t = "ab";
        //以上兩種創建方式,完全等價

如果運算時,等號右邊有一個“運算數”不為常量(即使該“運算數”是用雙引號創建的常量),則得到的結果相當於new創建的一個新的String對象,如:

        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。

        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
     //注意和上例的區別

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM