String 類和常量池

1:String 對象的兩種創建方式:

String str1 = "abcd";//先檢查字符串常量池中有沒有"abcd",如果字符串常量池中沒有,則創建一個,然後 str1 指向字符串常量池中的對象,如果有,則直接將 str1 指向"abcd"";
String str2 = new String("abcd");//堆中創建一個新的對象
String str3 = new String("abcd");//堆中創建一個新的對象
System.out.println(str1==str2);//false
System.out.println(str2==str3);//false
  •   第一種方式是在常量池中拿對象;
  •   第二種方式是直接在堆內存空間創建一個新的對象。
  •   記住一點:只要使用 new 方法,便需要創建新的對象。

 

2:String 類型的常量池比較特殊

    1、它的主要使用方法有兩種:

  • 直接使用雙引號聲明出來的 String 對象會直接存儲在常量池中。
  • 如果不是用雙引號聲明的 String 對象,可以使用 String 提供的 intern 方法。String.intern() 是一個 Native 方法,它的作用是:如果運行時常量池中已經包含一個等於此 String 對象內容的字符串,則返回常量池中該字符串的引用;如果沒有,則在常量池中創建與此 String 內容相同的字符串,並返回常量池中創建的字符串的引用。
String s1 = new String("計算機");
String s2 = s1.intern();
String s3 = "計算機";
System.out.println(s2);//計算機
System.out.println(s1 == s2);//false,因爲一個是堆內存中的 String 對象一個是常量池中的 String 對象,
System.out.println(s3 == s2);//true,因爲兩個都是常量池中的 String 對象

 

3:字符串拼接:

String str1 = "str";
String str2 = "ing";

String str3 = "str" + "ing";//常量池中的對象
String str4 = str1 + str2; //在堆上創建的新的對象      
String str5 = "string";//常量池中的對象
System.out.println(str3 == str4);//false
System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false

儘量避免多個字符串拼接,因爲這樣會重新創建對象。如果需要改變字符串的話,可以使用 StringBuilder 或者 StringBuffer。 

4:String s1 = new String("abc");這句話創建了幾個字符串對象?

    將創建 1 或 2 個字符串。如果池中已存在字符串文字“abc”,則池中只會創建一個字符串“s1”。如果池中沒有字符串文字“abc”,那麼它將首先在池中創建,然後在堆空間中創建,因此將創建總共 2 個字符串對象。

String s1 = new String("abc");// 堆內存的地址值
String s2 = "abc";
System.out.println(s1 == s2);// 輸出 false,因爲一個是堆內存,一個是常量池的內存,故兩者是不同的。
System.out.println(s1.equals(s2));// 輸出 true

 

5:8 種基本類型的包裝類和常量池 

  • Java 基本類型的包裝類的大部分都實現了常量池技術,即 Byte,Short,Integer,Long,Character,Boolean;這 5 種包裝類默認創建了數值[-128,127] 的相應類型的緩存數據,但是超出此範圍仍然會去創建新的對象。
  • 兩種浮點數類型的包裝類 Float,Double 並沒有實現常量池技術。
    Integer i1 = 33;
    Integer i2 = 33;
    System.out.println(i1 == i2);// 輸出 true
    Integer i11 = 333;
    Integer i22 = 333;
    System.out.println(i11 == i22);// 輸出 false
    Double i3 = 1.2;
    Double i4 = 1.2;
    System.out.println(i3 == i4);// 輸出 false

 

 

   

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章