日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转载] 整理下java中stringBuilder和stringBuffer两个类的区别

發(fā)布時(shí)間:2025/3/11 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载] 整理下java中stringBuilder和stringBuffer两个类的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考鏈接: Java中的StringBuffer類

StringBuilder和StringBuffer這兩個(gè)類在動(dòng)態(tài)拼接字符串時(shí)常用,肯定比String的效率和開銷小,這是因?yàn)镾tring的對(duì)象不會(huì)回收哦。?

?其實(shí)我一直用StringBuilder這個(gè)類,因?yàn)榭梢院?jiǎn)寫為sb的變量在程序里很爽,可是后來師兄說web程序特別是高并發(fā)的程序中不要用stringbuilder,因?yàn)楹?jiǎn)單說,stringBuilder不是線程安全的,而StirngBuffer就是線程安全的。從網(wǎng)上看到Stringbuffer中方法大都采用了synchronized的關(guān)鍵字修飾。?

?來來來,我們先復(fù)習(xí)下syncronized的用法,有篇博客寫的挺好的,給個(gè)鏈接 http://leo-faith.iteye.com/blog/177779?

??

?

? 1、synchronized關(guān)鍵字的作用域有二種: 1)是某個(gè)對(duì)象實(shí)例內(nèi),synchronized aMethod(){}可以防止多個(gè)線程同時(shí)訪問這個(gè)對(duì)象的synchronized方法(如果一個(gè)對(duì)象有多個(gè)synchronized方法,只要一個(gè)線程訪問了其中的一個(gè)synchronized方法,其它線程不能同時(shí)訪問這個(gè)對(duì)象中任何一個(gè)synchronized方法)。這時(shí),不同的對(duì)象實(shí)例的synchronized方法是不相干擾的。也就是說,其它線程照樣可以同時(shí)訪問相同類的另一個(gè)對(duì)象實(shí)例中的synchronized方法; 2)是某個(gè)類的范圍,synchronized static aStaticMethod{}防止多個(gè)線程同時(shí)訪問這個(gè)類中的synchronized static 方法。它可以對(duì)類的所有對(duì)象實(shí)例起作用。

?

? ?

?

? 2、除了方法前用synchronized關(guān)鍵字,synchronized關(guān)鍵字還可以用于方法中的某個(gè)區(qū)塊中,表示只對(duì)這個(gè)區(qū)塊的資源實(shí)行互斥訪問。用法是: synchronized(this){/*區(qū)塊*/},它的作用域是當(dāng)前對(duì)象;

?

?

?

? 3、synchronized關(guān)鍵字是不能繼承的,也就是說,基類的方法synchronized f(){} 在繼承類中并不自動(dòng)是synchronized f(){},而是變成了f(){}。繼承類需要你顯式的指定它的某個(gè)方法為synchronized方法;

?

?好了,言歸正傳,我們繼續(xù)StringBuffer和StringBuilder的區(qū)別。?

?就是說,StringBuffer中所有的方法都要加鎖,所以好多操作看上去都是線性操作的。所以要慢些。?

??

?

? 一般情況下,速度從快到慢:StringBuilder>StringBuffer>String.當(dāng)需要在循環(huán)中多次使用字符串拼接時(shí),建議使用StringBuilder或StringBuffer.當(dāng)數(shù)量級(jí)在百萬級(jí)(這里可能不準(zhǔn)確)時(shí),StringBuilder的速度會(huì)體現(xiàn)出來.

?

?

以下是實(shí)驗(yàn)數(shù)據(jù)?

??

??

?

??

? ?

? ? 01 final static int ttime = 30000;// 測(cè)試循環(huán)次數(shù)?

? ?

? ?

? ? 02? ?

? ?

? ?

? ? 03? ? ?public void test(String s) {?

? ?

? ?

? ? 04? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 05? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 06? ? ? ? ? ? ?s += "add";?

? ?

? ?

? ? 07? ? ? ? ?}?

? ?

? ?

? ? 08? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 09? ? ? ? ?System.out.println(" 操作 " + s.getClass().getName() + " 類型使用的時(shí)間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 10? ? ?}?

? ?

? ?

? ? 11? ?

? ?

? ?

? ? 12? ? ?public void test(StringBuffer s) {?

? ?

? ?

? ? 13? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 14? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 15? ? ? ? ? ? ?s.append("add");?

? ?

? ?

? ? 16? ? ? ? ?}?

? ?

? ?

? ? 17? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 18? ? ? ? ?System.out.println(" 操作 " + s.getClass().getName() + " 類型使用的時(shí)間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 19? ? ?}?

? ?

? ?

? ? 20? ?

? ?

? ?

? ? 21? ? ?public void test(StringBuilder s) {?

? ?

? ?

? ? 22? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 23? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 24? ? ? ? ? ? ?s.append("add");?

? ?

? ?

? ? 25? ? ? ? ?}?

? ?

? ?

? ? 26? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 27? ? ? ? ?System.out.println(" 操作 " + s.getClass().getName() + " 類型使用的時(shí)間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 28? ? ?}?

? ?

? ?

? ? 29? ?

? ?

? ?

? ? 30? ? ?// 對(duì) String 直接進(jìn)行字符串拼接的測(cè)試?

? ?

? ?

? ? 31? ? ?public void test2() {?

? ?

? ?

? ? 32? ? ? ? ?String s2 = "abadf";?

? ?

? ?

? ? 33? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 34? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 35? ? ? ? ? ? ?String s = s2 + s2 + s2;?

? ?

? ?

? ? 36? ? ? ? ?}?

? ?

? ?

? ? 37? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 38? ? ? ? ?System.out.println(" 操作字符串對(duì)象引用相加類型使用的時(shí)間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 39? ? ?}?

? ?

? ?

? ? 40? ?

? ?

? ?

? ? 41? ? ?public void test3() {?

? ?

? ?

? ? 42? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 43? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 44? ? ? ? ? ? ?String s = "abadf" + "abadf" + "abadf";?

? ?

? ?

? ? 45? ? ? ? ?}?

? ?

? ?

? ? 46? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 47? ? ? ? ?System.out.println(" 操作字符串相加使用的時(shí)間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 48? ? ?}?

? ?

? ?

? ? 49? ?

? ?

? ?

? ? 50? ? ?public static void main(String[] args) {?

? ?

? ?

? ? 51? ? ? ? ?String s1 = "abc";?

? ?

? ?

? ? 52? ? ? ? ?StringBuffer sb1 = new StringBuffer("abc");?

? ?

? ?

? ? 53? ? ? ? ?StringBuilder sb2 = new StringBuilder("abc");?

? ?

? ?

? ? 54? ? ? ? ?Test t = new Test();?

? ?

? ?

? ? 55? ? ? ? ?t.test(s1);?

? ?

? ?

? ? 56? ? ? ? ?t.test(sb1);?

? ?

? ?

? ? 57? ? ? ? ?t.test(sb2);?

? ?

? ?

? ? 58? ? ? ? ?t.test2();?

? ?

? ?

? ? 59? ? ? ? ?t.test3();?

? ?

? ?

? ? 60? ? ?}?

? ?

??

?

??

試驗(yàn)結(jié)果如下:?

??

??

? 操作 java.lang.String 類型使用的時(shí)間為: 2432 毫秒??

? 操作 java.lang.StringBuffer 類型使用的時(shí)間為: 3 毫秒??

? 操作 java.lang.StringBuilder 類型使用的時(shí)間為: 3 毫秒??

? 操作字符串對(duì)象引用相加類型使用的時(shí)間為: 6 毫秒??

? 操作字符串相加使用的時(shí)間為: 1 毫秒??

??

?把循環(huán)次數(shù)調(diào)的很大,試了用下jconsle來監(jiān)視內(nèi)存GC,第一次使用,不太明白,有個(gè)博客寫的很好的,有空研究一下?

? http://jiajun.iteye.com/blog/810150?

?再補(bǔ)充一個(gè)Jstat的工具 http://xiaolele.iteye.com/blog/592022?

?/**?

?*20120516昨天忘看源代碼了?

?**/?

?StringBuffer中append方法有很多重載,有synchronized關(guān)鍵字沒錯(cuò),主要調(diào)用的還是AbstractStringBuilder的super的方法。?

??

?

??

? ?

? ? 1 public synchronized StringBuffer append(String s)?

? ?

? ?

? ? 2 {?

? ?

? ?

? ? 3? ? ?super.append(s);?

? ?

? ?

? ? 4? ? ?return this;?

? ?

? ?

? ? 5 }?

? ?

??

?

??

父類的方法為?

??

?

??

? ?

? ? 01 public AbstractStringBuilder append(String s) {?

? ?

? ?

? ? 02? ?

? ?

? ?

? ? 03? ? ?if (s == null)?

? ?

? ?

? ? 04? ? ? ? ?s = "null";?

? ?

? ?

? ? 05? ? ?int i = s.length();?

? ?

? ?

? ? 06? ? ?if (i == 0)?

? ?

? ?

? ? 07? ? ? ? ?return this;?

? ?

? ?

? ? 08? ? ?int j = count + i;?

? ?

? ?

? ? 09? ? ?if (j > value.length)?

? ?

? ?

? ? 10? ? ? ? ?expandCapacity(j);?

? ?

? ?

? ? 11? ? ?s.getChars(0, i, value, count);?

? ?

? ?

? ? 12? ? ?count = j;?

? ?

? ?

? ? 13? ? ?return this;?

? ?

? ?

? ? 14 }?

? ?

??

?

??

??

?StringBuilder類中的append就沒有同步的關(guān)鍵字了。父類的方法基本上差不多。?

?總結(jié)一下,StringBuffer線程安全,內(nèi)部有synchronized方法,StringBuilder是1.5之后出來的,高并發(fā)就不要用了。另外synchronized的使用要熟悉,以后研究下java內(nèi)存的工具,比如jconsle。?

? ?

?轉(zhuǎn)載:http://my.oschina.net/zimingforever/blog/57514

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的[转载] 整理下java中stringBuilder和stringBuffer两个类的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。