StringBuilder和StringBuffer
String的長度是固定不變的,你不能改變它的內容,任何對String的修改都將產生新的String對象。因此,如果你的代碼對字符串的操作頻繁的話,那麼對於系統來說就是一筆很大的開銷。所以在java 5.0推出了StringBuilder,這個類默認初始16個字符的長度,你也可以自行設置長度,如果字符的長度超出了可容納的長度,它可以自動增加長度。
大家都知道HashTable是線程安全的,而HashMap是線程不安全的,但是我們在單線程中經常使用HashMap,而不使用HashTable,因爲它新增了內容,勢必會花開銷去維護這新增的內容,因此在單線程中,它不僅沒佔優勢,想法,還處於弱勢。同理,我們的java在推出了stringbuilder之後又退出了stringbuffer,區別跟上面類似,Stringbuilder是線程不安全的,所以它在單線程的效率要比Stringbuffer要高,但在syncronized中最好還是使用線程安全的類。雖然這樣,但這倆個類比String類的效率仍舊是高的多,所以這兩個類是作爲string的取代類而存在的。
當然,如果你有興趣,你可以試一下,每個String添加1000條數據,每次開始前打印當前時間(system.currentTimeMillis()),然後結束再打印一下,從而查看這三者時間的差距,你就可以得出同樣的結論。
它的主要操作有append和insert方法,可重載以接收任意類型的數據,append是添加到字符串的末尾,而insert是指定位置插入。
下面就是基本使用方法,Stringbuffer類似,他們只有線程安全不安全的區別,其餘的都是差不多的。
public class stringbuilder01 { public static void main(String[] args) { StringBuilder stringbuilder=new StringBuilder(); //StringBuilder.append(obj)實現將一個對象作爲字符存入,這裏面還可以是8中數據類型、string和stringbuilder對象 stringbuilder.append("123"); //stringbuilder.charAt(index)獲得位置在index索引的char字符值 stringbuilder.charAt(0); //stringbuilder.indexOf("string")獲得某個字符串第一次出現的索引 stringbuilder.indexOf("12"); //最後一次出現的索引stringbuilder.lastIndexOf("string"); stringbuilder.lastIndexOf("12"); //stringbuilder.insert(index,T)可以在index的位置,插入8中基本數據類型或者char數組 stringbuilder.insert(0,"123"); //stringbuilder.delete(start, end)刪除某一段內容 //stringbuilder.replace(begin, end, String);將字符中begin開始到end的位置使用string替換 stringbuilder.replace(0, 1, "hello"); } } |