JAVA之String、StringBuffer、StringBuilder 的區別
①
String類是final類,也即意味著String類不能被繼承,並且它的成員方法都預設為final方法。在Java中,被final修飾的類是不允許被繼承的,並且該類中的成員方法都預設為final方法。在早期的JVM實現版本中,被final修飾的方法會被轉為內嵌呼叫以提升執行效率。而從Java SE5/6開始,就漸漸擯棄這種方式了。因此在現在的Java SE版本中,不需要考慮用final去提升方法呼叫效率。只有在確定不想讓該方法被覆蓋時,才將方法設定為final。
②
對String物件的任何改變都不影響到原物件,相關的任何change操作都會生成新的物件
③
通過new關鍵字來生成物件是在堆區進行的,而在堆區進行物件生成的過程是不會去檢測該物件是否已經存在的。因此通過new來建立物件,創建出的一定是不同的物件,即使字串的內容是相同的。
④
任何的字串常量都是String物件,而且String的常量一旦宣告不可改變,如果改變物件內容,改變的是其引用的
指向而已。
通常來講String的操作比較簡單,但是由於String的不可更改特性,為了方便字串的修改,提供StringBuffer類。
在String中使用"+"來進行字串連線,但是這個操作在StringBuffer類中需要更改為append()方法。
public synchronized StringBuffer append(各種資料型別 b)
⑤
StringBuilder和StringBuffer類擁有的成員屬性以及成員方法基本相同,區別是StringBuffer類的成員方法前面多了一個關鍵字:synchronized,不用多說,這個關鍵字是在多執行緒訪問時起到安全保護作用的,也就是說StringBuffer是執行緒安全的。
⑥
對於直接相加字串,效率很高,因為在編譯器便確定了它的值,也就是說形如"I"+“love”+“java”; 的字串相加,在編譯期間便被優化成了"Ilovejava"。這個可以用javap -c命令反編譯生成的class檔案進行驗證。對於間接相加(即包含字串引用),形如s1+s2+s3; 效率要比直接相加低,因為在編譯器不會對引用變數進行優化。
⑦
String、StringBuilder、StringBuffer三者的執行效率:
StringBuilder > StringBuffer > String
當然這個是相對的,不一定在所有情況下都是這樣。
比如String str = “hello”+ "world"的效率就比 StringBuilder st = new StringBuilder().append(“hello”).append(“world”)要高。
因此,這三個類是各有利弊,應當根據不同的情況來進行選擇使用:
當字串相加操作或者改動較少的情況下,建議使用 String str="hello"這種形式;
當字串相加操作較多的情況下,建議使用StringBuilder,如果採用了多執行緒,則使用StringBuffer