JavaSE學習筆記12:常用類之StringBuffer與StringBuilder
阿新 • • 發佈:2020-11-01
常用類之StringBuffer
StringBuffer
問:在實際的開發中,如果需要進行字串的頻繁拼接,會有什麼問題?
答:因為java中的字串是不可變的,每一次拼接都會產生新字串,
這樣會佔用大量的方法區記憶體,造成記憶體空間的浪費
String s = "abc";
s += "hello"
就以上兩行程式碼,就導致在方法區字串常量池當中建立了3個物件
"abc"、"hello"、"abchello"
public class StringBufferTest01 { public static void main(String[] args) { String s = ""; //這樣做會給java的方法區字串常量池帶來很大的壓力 for (int i = 0; i < 100; i++) { s += i; System.out.println(s); } /* 執行結果: 0 01 012 0123 01234 ... */ } }
如果以後需要進行大量字串的拼接操作,建議使用JDK中自帶的:
java.lang.StringBuffer
java.lang.StringBuilder
注意:
- StringBuffer底層實際上是一個byte[]陣列
- 往StringBuffer中放字串,實際上是放到byte陣列當中了
- StringBuffer的初始容量是16
package se2.stringBuffer; /* 如何優化StringBuffer的效能? 在建立StringBuffer的時候儘可能給定一個初始化容量 最好減少底層陣列的擴容次數,預估計一下,給一個大一些的初始化容量 關鍵點:給定一個合適的初始化容量,可以提高程式的執行效率 */ public class StringBufferTest02 { public static void main(String[] args) { //建立一個初始化容量為16的byte[]陣列(字串緩衝區物件) StringBuffer stringBuffer = new StringBuffer(); //拼接字串,以後拼接字串統一呼叫append()方法 //append是追加的意思 stringBuffer.append("a"); stringBuffer.append("b"); stringBuffer.append("c"); stringBuffer.append(3.14); stringBuffer.append(true); //append方法底層在進行追加的時候,如果byte陣列滿了,會自動擴容 stringBuffer.append(100L); System.out.println(stringBuffer);//abc3.14true100 //System.out.println(stringBuffer.toString()); //指定初始化容量為100的StringBuffer物件(字串緩衝區物件) StringBuffer sb = new StringBuffer(100); sb.append("hello"); sb.append("world"); sb.append("hello"); sb.append("kitty"); System.out.println(sb);//helloworldhellokitty } }
StringBuilder
package se2.stringBuffer; /* StringBuffer和StringBuilder的區別 StringBuffer中的方法都有:synchronized關鍵字修飾,表示StringBuffer在多執行緒環境下執行是安全的 StringBuilder中的方法都沒有:synchronized關鍵字修飾,表示StringBuilder在多執行緒環境下執行是不安全的 StringBuffer是執行緒安全的 StringBuilder是非執行緒安全的 */ public class StringBuilderTest01 { public static void main(String[] args) { //使用StringBuilder也是可以完成字串的拼接 StringBuilder sb = new StringBuilder(); sb.append(100); sb.append(true); sb.append("hello"); sb.append("kitty"); System.out.println(sb); } }