標籤:判斷 uil 序列 尋找 buffer 自動 bubuko stringbu build
一、String的解析
1.String的含義
①String是不可以被繼承的,String類是final類,String類是由char[]數組來儲存字串。
②String是不可變的字元序列,如果儲存abc則在字串常量池中開闢長度固定為3的字元數組,無論怎麼改變均會產生新的執行個體。
2.String的方法
由可知String的方法,不是在原有字串的基礎上進行修改的,都是new出了新的執行個體,因為String是不可變的字元序列。Sring對象的任何改變都不會改變原有的字串。
二、字串常量池的概念
1.String c = “abc” String cc = new String(“abc”)在記憶體中分布情況?
①Sting c = “abc” 先在字串常量池中尋找,如果常量池中沒有,就執行個體化該字串,並放到常量池中;如果池中存在abc,直接將字串的地址賦值給c,c指向常量池的abc。
②String cc = new String(“abc”) 先在字串常量池中找abc,如果存在再在堆中開闢一個空間指向常量池中的abc,棧中的cc指向堆中的0x12.
③一共開闢了4塊記憶體空間,String cc = new String(“abc”)如果池子中有abc則,建立一個對象,如果池子中沒有abc則建立2個對象。
④String cc = new String (“dec”) 的執行順序是先從右向左。先判斷dec在常量池中是否存在。如果不存在執行個體化一個放入池子中,再new堆中的對象。
2.分情況說明
①非new執行個體,結果是true,都是指向的字串常量池中123。
②new執行個體,結果是false一個指向池子,一個指向堆記憶體,地址不一致。
③new執行個體2,結果是false,只要是new 出的執行個體在記憶體中就會開闢空間,二者的地址不一致,所以返回false。
④一個字串由多個字串拼接而成時,它本身也是字串常量。
new出的對象不能再編譯期間確定,cz02和cz03也不能再編譯器確定。cz04和cz05都指向堆記憶體,cz04的值是在程式運行時確定的。
【常量找池,變數找堆】
⑤編譯期最佳化,jvm將+串連最佳化為串連後的值,在編譯期其值就是”a1”.
⑥字串常量拼接和字串引用的拼接,常量的”+”拼接是在編譯期完成的,而字串引用拼接(“+”),是在程式運行時確定的。一個在指向字串常量池,一個指向堆記憶體。
三、String、StringBuilder、StringBuffer解析和比較
1.String簡單總結
①String不可變的字元序列
②new的對象,一定是建立了對象,在堆中開闢空間。
③直接賦值和new兩種方式建立String類型的對象。
④直接賦值不一定建立對象,如果字串常量池中有的話就直接堆中的執行個體指向常量池中,不需要建立對象。
⑤final修飾類,不能被繼承。
⑥String a = “1”+“2”+“3”+“4”;這個字串拼接過程要產生多個對象完成,效率比較低。
2.String和StringBuilder、StringBuffer的區別?
①可變性:String不可變的字元序列,Builder和Buffer是可變的字元序列。
②安全執行緒:String是安全執行緒的,StringBuilder是線程不安全的,StringBuffer是安全執行緒。StringBuidler效率高於StringBuffer。因為String是不可變的一般情況下,效率最低。
③使用方式:如果字串變換較少,使用String類型,如果拼接操作較多使用StringBuilder,如果要求安全執行緒使用StringBuffer。
3.StringBuffer可變字元序列的解析
①初始容量為16
②自動擴容:初始容量的2倍加2
java--String、StringBuilder、StringBuffer的解析和比較?