1. 程式人生 > >從String,StringBuilder和StringBuffer的使用談起JVM的記憶體區域與記憶體分配(一)

從String,StringBuilder和StringBuffer的使用談起JVM的記憶體區域與記憶體分配(一)

  好記性不如爛筆頭,抽出閒暇時間總結一下JVM的記憶體區域,這裡我從字串的StringBuilder的和StringBuffer的的的區別和使用談起。

首先我們先了解一下String's ==和equals的區別:

這裡先直接給出結論:
      String定義的物件是引用型別的變數,該變數儲存的並不是“值”本身,而是其關聯的物件在記憶體中的地址。==比較的是兩個變數是否指向同一個地址.equals比較的是兩個物件的值是否相等。

      對於這8種基本資料型別的變數:使用“==”比較值是否相等直接
看程式碼方便理解上面的總結,如上,可以看出str1 ,STR2地址相同,且與STR3,STR4地址不同.str1 =“ABC”的建立過程:先在棧中建立一個字串物件的引用變數STR1;然後查詢堆中常量池裡是否有“ABC”;如果沒有,則將“ABC”存放進常量池,並令STR1指向“ABC”;若有” ABC‘則直接令STR1指向’ABC“而STR3,STR4使用新的關鍵字建立字串物件,每呼叫一次就會建立一個新的物件:先在堆中建立一個包含指定內容的字串物件,並將在棧中建立的引用變數STR3指向該物件;去字串常量池中 看,是否包含該內容的物件,若有,則將堆中的物件與字串常量池中內容相同的物件聯絡起來,若沒有,則在字串常量池中再建立一個包含該內容的字串物件,並將堆中的物件與字串常量池中新創建出來的物件聯絡起來下面我們從字串的原始碼分析:如上,為字串的相等的原始碼,首先判斷兩個物件變數是否指向同一個物件,如果是返回真;然後判斷是否是字串物件,是字串物件包含的字串長度相同,逐位比較。
在這裡插入圖片描述




在這裡插入圖片描述

字串的StringBuilder和StringBuffer的

同樣我們直接給出結論:
a,String中的值[]字元陣列是私有的,不可以修改,String是不可變類;而StringBuilder和StringBuffer繼承AbstractStringBuilder類,是可變類
.b,三者在執行速度方面的比較:StringBuilder> StringBuffer> String
c,StringBuffer:執行緒安全的,String和StringBuilder執行緒非安全的
       

如下圖,是三者的執行時間,很明顯String的執行速度最慢,這是因為str1 + = “c”的執行過程是:將原有的str變數指向的物件內容取出與“c”作字串相加操作再存進另一個新的字串物件當中,再讓str變數指向新生成的物件而原來的str指向的地址就會被JVM的垃圾回收機制(GC)給回收掉了,所以,str實際上並沒有被更改;str1 + = “c”對字串物件進行的操作實際上是一個不斷建立新的物件並且將舊的物件回收的一個過程。

對於三者使用的總結:

1、如果要操作少量的資料用String 

2、單執行緒作字串緩衝區下操作大量資料用StringBuilder

3、多執行緒操作字串緩衝區下操作大量資料用 StringBuffe
在這裡插入圖片描述