前言
最近發現團隊成員在Java代碼方面的質量不夠高,准備寫一些基礎的文章,供大家參考。
一、定義
String是不可變字符序列。
StringBuffer是可變的字符序列。
StringBuilder也是可變的字符序列。
1、StringBuffer和StringBuilder的唯一區別
StringBuffer對象是線程安全的,這意味著StringBuffer對象可以同時被多個並行線程修改,因為它所有的方法都被聲明為"synchronized(同步)"。
StringBuilder類是JDK 1.5版引入的非線程安全的類,這意味著它的所有方法都是非同步方法。
因此,在單一模型的應用中,我們應該使用StringBuilder,這樣對象不會有鎖定和解鎖,這樣性能就會增加。
而在單線程模型應用中,會按順序執行操作,因此對象不會崩潰。
2、什麼時候選擇String和StringBuffer
如果我們不需要在同一內存空間中存儲字符串的修改,那麼我們必須使用String。
而如果需要在同一內存空間中存儲字符串的修改,那麼我們必須使用StringBuffer或StringBuilder。
3、String的優缺點
優點:使用String時,如果字符串發生修改,那麼修改後的內容會保存在內存中的不同位置,這樣的話,內存中就同時有原始的字符串值和修改後的字符串值。
缺點:對於每一個這樣的操作,它會消耗更多的內存,因為它把修改後的字符串值存儲在新的內存空間中。因此它會導致性能問題。
解決方案:要解決這個性能問題,開發者應該使用StringBuilder或者StringBuffer來實現字符串的修改,然後再轉換成String對象把字符串傳遞給用戶。
4、StringBuffer和StringBuilder的優缺點
優點:StringBuffer和StringBuilder有更好的性能,因為它們對內存的消耗更少,所有對字符串的修改操作都存儲在同一內存位置。
缺點:修改前的原始字符串值不會被保留。
二、創建String或StringBuffer對象
String對象的創建有兩種方式
1)直接使用字符串賦值創建對象
String str = "instance of java for us";
2)使用String構造器創建對象
String str = new String("instance of java for us");
StringBuffer對象的創建
使用構造器
StringBuffer str = new StringBuffer();
StringBuilder對象的創建
使用構造器
StringBuilder str = new StringBuilder();
三、在StringBuffer和StringBuilder只能執行指定的操作
可以執行字符串的追加、插入、刪除、反向等操作
因為String對象是不可變的對象,因此這些操作不能在String對象中執行。
四、字符串的連接
使用String對象來把新字符串連接到現有的字符串上,有兩種方法:
1、使用“+”操作符
2、使用concat()方法
而使用StringBuffer連接字符串,只有一種方法:使用append()方法
而使用StringBuilder連接字符串,只有一種方法:使用append()方法
示例代碼:
package com.ch;
public Class Demo{
public static void main(String args[]) {
String str="Java";
StringBuffer sb= new StringBuffer("Java");
StringBuilder sbr= new StringBuilder("Java");
System.out.println(str.concat(" language"));
System.out.println(sb.append(" language"));
System.out.println(sbr.append(" language"));
}
}
輸出:
Java language
Java language
Java language
五、比較
Object對equals()方法的定義是:對象a和b如果是同一個對象的引用,那麼a.equals(b)返回true,否則返回false。
而String類重寫了Object的equals()方法,String對象的equals()方法比較的是內容,內容相等則返回true。
StringBuffer和StringBuilder則沒有重寫equals()方法,與Object的equals()方法的定義相同。