1. 程式人生 > >深入String類

深入String類

問題1:為什麼String既可以當基本型別又可以當引用型別使用?

1、String是引用資料型別,不是基本資料型別。java除了8種常用的基本型別以外都是引用資料型別。
2、String str = “abc” 實際是將str引用指向常量池的字串”abc”,String之所以可以看做基本型別是因為String是最簡單的引用型別。實則String是引用型別
String str1=new String(“abc”) 引用型別的常用寫法

JVM記憶體模型


1、儲存的是物件,每個物件都包含一個與之對應的class
2、JVM只有一個堆區被所有執行緒共享,堆中不存放基本型別和物件引用,只存放物件本身
3、物件由垃圾回收器負責回收,因此大小和生命週期不需要確定


1、每個執行緒都包含一個棧區,棧中只儲存基礎資料型別的物件和自定義物件的引用(不是物件)
2、每個棧中的資料(原始型別和物件引用)都是私有的
3、棧分為3個部分:基本型別變數區、執行環境上下文、操作指令區(存放操作指令)
4、資料大小和生命週期是可以確定的,當沒有引用指向資料時,這個資料就會自動消失
方法區
靜態區,跟堆一樣,被所有的執行緒共享
方法區中包含的都是在整個程式中永遠唯一的元素,如class,static變數

參考題

String str1 = "hello";
String str2 = "hello";
System.out.printl(str1 == str2);//true

String str1 = new String(“A” + “B”);會建立多少個物件
String str2 = new String(“ABC”) + “ABC”;會建立多少個物件
str1:
字串常量池:A B AB 3個
堆:new String(“AB”) 1個
引用:str1:1個
總共:5個

str2:
字串常量池:ABC 1個
堆:new String(“ABC”) 1個
引用:str2 1個
總共:3個

String.intern()

通過new操作符建立的字串物件不指向字串池中的任何物件,但是可以通過使用字串的intern()方法來指向其中的某一個。java.lang.String.intern()返回一個保留池字串,就是一個在全域性字串池中有了一個入口。如果以前沒有在全域性字串池中,那麼它就會被新增到裡面

   // Create three strings in three different ways.
    String s1 = "Hello";
    String s2 = new StringBuffer("He").append("llo").toString();
    String s3 = s2.intern();

    // Determine which strings are equivalent using the ==
    // operator
    System.out.println("s1 == s2? " + (s1 == s2)); // false
    System.out.println("s1 == s3? " + (s1 == s3)); // true