讀帖有感。
今天看到一篇部落格是講解string,以及string使用堆、棧、常量池。講的和仔細,很透徹,很接近底層,有一定的難度。
原貼:想理解string和堆、棧、常量池這三者之間的關係就必須清楚拘留字串物件。
拘留池(其中的常量字元就是拘留字串物件)
公共語言執行庫會自動維護乙個名為「拘留池」(intern pool) 的表,它包含程式中以程式設計方式宣告或建立的每個唯一的字串的乙個引用。因此,具有特定值的字串的例項在系統中只有乙個。
//**1
string sa=new string("hello world");
string sb=new string("hello world");
system.out.println(sa==sb); // false
//**2
string sc="hello world";
string sd="hello world";
system.out.println(sc==sd); // true
如部落格中所講:
string sa=new string("hello world"); 開始執行,jvm就已經為"hello world"在堆中建立了乙個拘留字串( 值得注意的是:如果源程式中還有乙個"hello world"字串常量,那麼他們都對應了同乙個堆中的拘留字串)。然後用這個拘留字串的值來初始化堆中用new指令建立出來的新的string物件,區域性變數sa實際上儲存的是new出來的堆物件位址。此時在jvm管理的堆中,有兩個相同字串值的string物件:乙個是拘留字串物件,乙個是new新建的字串物件。
string sb=new string("hello world"); 去執行的時候,去拘留池中比較有"hello world",然後用此拘留物件來初始化堆中new出來的新string物件,然後把這個位址存到sb中去。
因此,sa 和sb不一樣。(在堆中初始化後,有了兩個新的string物件了)
區域性變數sc儲存的是早已建立好的拘留字串的堆位址。 sc執行時去對比,有了拘留字串物件,直接儲存起物件位址
因此兩者相同。
再對有+的進行來分析。
string sd="abcd"; "ab"+"cd"會直接在編譯期就合併成常量"abcd", 因此相同字面值常量"abcd"所對應的是同乙個拘留字串物件,
string(大姐,出生於jdk1.0時代) 不可變字串行
stringbuffer(二姐,出生於jdk1.0時代) 執行緒安全的可變字串行
stringbuilder(小妹,出生於jdk1.5時代) 非執行緒安全的可變字串行
String類和常量池
1.全域性字串常量池 string pool 全域性字串常量池中存放的內容是在類載入完成後存到string pool中的,在每個vm中只有乙份,存放的是字串常量的引用值 在堆中生成字串物件例項 2.class檔案常量池 class constant pool class常量池是在編譯的時候每個cla...
String類和常量池
string物件的兩種建立方式 string str1 abcd 先檢查字串常量池中有沒有 abcd 如果字串常量池中沒有,則建立乙個,然後 str1 指向字串常量池中的物件,如果有,則直接將 str1 指向 abcd string str2 new string abcd 堆中建立乙個新的物件 s...
String 類和常量池
1 string 物件的兩種建立方式 string str1 abcd 先檢查字串常量池中有沒有 abcd 如果字串常量池中沒有,則建立乙個,然後 str1 指向字串常量池中的物件,如果有,則直接將 str1 指向 abcd string str2 new string abcd 堆中建立乙個新的物...