日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > Java > 正文

Java之String、StringBuffer、StringBuilder的區(qū)別分析

2019-11-26 16:18:58
字體:
來源:轉載
供稿:網友
相信大家對 String 和 StringBuffer 的區(qū)別也已經很了解了,但是估計還是會有很多同志對這兩個類的工作原理有些不清楚的地方,今天我在這里重新把這個概念給大家復習一下,順便牽出 J2SE 5.0 里面帶來的一個新的字符操作的類―― StringBuilder 。那么這個 StringBuilder 和 StringBuffer 以及我們最早遇見的 String 類有那些區(qū)別呢?在不同的場合下我們應該用哪個呢?我講講自己對這幾個類的一點看法,也希望大家提出意見,每個人都有錯的地方,在錯了改的同時更是一個學習的好機會。

簡要的說, String 類型和 StringBuffer 類型的主要性能區(qū)別其實在于 String 是不可變的對象(為什么?問問 Java 的設計者吧,為什么 String 不是原生類型呢?)因此在每次對 String 類型進行改變的時候其實都等同于生成了一個新的 String 對象,然后將指針指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因為每次生成對象都會對系統(tǒng)性能產生影響,特別當內存中無引用對象多了以后, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。這里嘗試舉個不是很恰當的例子:
復制代碼 代碼如下:

String S1 = "abc";
For(int I = 0 ; I < 10000 ; I ++) // For 模擬程序的多次調用
{
S1 + = "def";
S1 = "abc";
}


如果是這樣的話,到這個 for 循環(huán)完畢后,如果內存中的對象沒有被 GC 清理掉的話,內存中一共有 2 萬多個了,驚人的數目,而如果這是一個很多人使用的系統(tǒng),這樣的數目就不算很多了,所以大家使用的時候一定要小心。

而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對象經常改變的情況下。而在某些特別情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度并不會比 StringBuffer 對象慢,而特別是以下的字符串對象生成中, String 效率是遠要比 StringBuffer 快的:

復制代碼 代碼如下:

String S1 = "This is only a" + " simple" + " test";
StringBuffer Sb = new StringBuilder("This is only a").append(" simple").append(" test");


你會很驚訝的發(fā)現,生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不占優(yōu)勢。其實這是 JVM 的一個把戲,在 JVM 眼里,這個
復制代碼 代碼如下:

String S1 = "This is only a" + " simple" + "test"; 其實就是: String S1 = "This is only a simple test"; 所以當然不需要太多的時間了。但大家這里要注意的是,如果你的字符串是來自另外的 String 對象的話,速度就沒那么快了,譬如:
String S2 = "This is only a";
String S3 = " simple";
String S4 = " test";
String S1 = S2 +S3 + S4;

這時候 JVM 會規(guī)規(guī)矩矩的按照原來的方式去做, S1 對象的生成速度就不像剛才那么快了,一會兒我們可以來個測試作個驗證。

由此我們得到第一步結論: 在大部分情況下 StringBuffer > String

而 StringBuilder 跟他們比又怎么樣呢?先簡單介紹一下, StringBuilder 是 JDK5.0 中新增加的一個類,它跟 StringBuffer 的區(qū)別看下面的介紹(來源 JavaWorld ):

Java.lang.StringBuffer 線程安全的可變字符序列。類似于 String 的字符串緩沖區(qū),但不能修改??蓪⒆址彌_區(qū)安全地用于多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發(fā)生的,該順序與所涉及的每個線程進行的方法調用順序一致。

每個字符串緩沖區(qū)都有一定的容量。只要字符串緩沖區(qū)所包含的字符序列的長度沒有超出此容量,就無需分配新的內部緩沖區(qū)數組。如果內部緩沖區(qū)溢出,則此容量自動增大。從 JDK 5.0 開始,為該類增添了一個單個線程使用的等價類,即 StringBuilder 。與該類相比,通常應該優(yōu)先使用 StringBuilder 類,因為它支持所有相同的操作,但由于它不執(zhí)行同步,所以速度更快。

但是如果將 StringBuilder 的實例用于多個線程是不安全的。需要這樣的同步,則建議使用 StringBuffer 。

這樣說估計大家都能明白他們之間的區(qū)別了,那么下面我們再做一個一般性推導:

在大部分情況下 StringBuilder > StringBuffer

因此,根據這個不等式的傳遞定理: 在大部分情況下 StringBuilder > StringBuffer > String

既然有這樣的推導結果了,我們做個測試驗證一下:

測試代碼如下:
復制代碼 代碼如下:

public class testssb {

/** Creates a new instance of testssb */
final static int ttime = 10000;// 測試循環(huán)次數
public testssb() {
}

public void test(String s){
long begin = System.currentTimeMillis();
for(int i=0;i<ttime;i++){
s += "add";
}
long over = System.currentTimeMillis();
System.out.println(" 操作 "+s.getClass().getName()+" 類型使用的時間為: " + (over - begin) + " 毫秒 " );
}

public void test(StringBuffer s){
long begin = System.currentTimeMillis();
for(int i=0;i<ttime;i++){
s.append("add");
}
long over = System.currentTimeMillis();
System.out.println(" 操作 "+s.getClass().getName()+" 類型使用的時間為: " + (over - begin) + " 毫秒 " );
}

public void test(StringBuilder s){
long begin = System.currentTimeMillis();
for(int i=0;i<ttime;i++){
s.append("add");
}
long over = System.currentTimeMillis();
System.out.println(" 操作 "+s.getClass().getName()+" 類型使用的時間為: " + (over - begin) + " 毫秒 " );
}

// 對 String 直接進行字符串拼接的測試
public void test2(){
String s2 = "abadf";
long begin = System.currentTimeMillis();
for(int i=0;i<ttime;i++){
String s = s2 + s2 + s2 ;
}
long over = System.currentTimeMillis();
System.out.println(" 操作字符串對象引用相加類型使用的時間為: " + (over - begin) + " 毫秒 " );
}

public void test3(){
long begin = System.currentTimeMillis();
for(int i=0;i<ttime;i++){
String s = "abadf" + "abadf" + "abadf" ;
}
long over = System.currentTimeMillis();
System.out.println(" 操作字符串相加使用的時間為: "+ (over - begin) + " 毫秒 " );
}

public static void main(String[] args){
String s1 ="abc";
StringBuffer sb1 = new StringBuffer("abc");
StringBuilder sb2 = new StringBuilder("abc");

testssb t = new testssb();
t.test(s1);
t.test(sb1);
t.test(sb2);
t.test2();
t.test3();
}
}

以上代碼在 NetBeans 5.0 IDE/JDK1.6 上編譯通過,循環(huán)次數 ttime 為 10000 次的測試結果如下:
操作 java.lang.String 類型使用的時間為: 4392 毫秒
操作 java.lang.StringBuffer 類型使用的時間為: 0 毫秒
操作 java.lang.StringBuilder 類型使用的時間為: 0 毫秒
操作字符串對象引用相加類型使用的時間為: 15 毫秒
操作字符串相加使用的時間為: 0 毫秒

好像還看不出 StringBuffer 和 StringBuilder 的區(qū)別,把 ttime 加到 30000 次看看:
操作 java.lang.String 類型使用的時間為: 53444 毫秒
操作 java.lang.StringBuffer 類型使用的時間為: 15 毫秒
操作 java.lang.StringBuilder 類型使用的時間為: 15 毫秒
操作字符串對象引用相加類型使用的時間為: 31 毫秒
操作字符串相加使用的時間為: 0 毫秒

StringBuffer 和 StringBuilder 的性能上還是沒有太大的差異,再加大到 100000 看看,這里就不加入對 String 類型的測試了,因為對 String 類型這么大數據量的測試會很慢滴……
操作 java.lang.StringBuffer 類型使用的時間為: 31 毫秒
操作 java.lang.StringBuilder 類型使用的時間為: 16 毫秒

能看出差別了,但其中有多次的測試結果居然是 StringBuffer 比 StringBuilder 快,再加大一些到 1000000 看看(應該不會當機吧?):
操作 java.lang.StringBuffer 類型使用的時間為: 265 毫秒
操作 java.lang.StringBuilder 類型使用的時間為: 219 毫秒

有些少區(qū)別了,而且結果很穩(wěn)定,再大點看看, ttime = 5000000 :

?????? Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ??????

呵呵,算了,不去測試了,基本來說都是在性能上都是 StringBuilder > StringBuffer > String 的了。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产日韩精品在线观看| 日韩一级二级三级精品视频| 国产专区中文字幕| 国产 欧美在线| 日韩高清不卡| 国产视频二区| 欧美日韩在线不卡| 中文字幕久久av| 91精品久久久久久久久久| 日韩欧美在线视频日韩欧美在线视频| 中文字幕精品视频在线| 亚洲最新永久观看在线| 国产一二三四| av亚洲免费| 久久久精品午夜少妇| 中文字幕一区二区三区精品| 精品久久久精品| 欧美高清一级片在线| 欧美日韩中文字幕精品| 国产黄色在线免费观看| 日韩视频国产视频| 日韩中文字幕视频在线观看| 中文字幕在线观看视频www| 顶级网黄在线播放| 蜜桃久久av一区| 欧美日韩国产高清一区| 一级特黄aaa大片在线观看| 亚洲欧美中文字幕| 亚洲免费在线视频一区 二区| 国产中文伊人| 欧美亚洲国产激情| 蜜桃精品在线| 亚洲国产一区自拍| 亚洲免费精品视频| 蜜桃精品在线| 国产绿帽一区二区三区| 伊人国产视频| 久久精品日韩无码| 色www精品视频在线观看| 日韩欧美不卡视频| 精品婷婷伊人一区三区三| 影音先锋一区二区资源站| 欧美日韩一二三四| 高清中文字幕在线| 久99久视频| 一区二区视频国产| 亚洲一区在线观看网站| 最近中文字幕在线中文视频| 久久久91精品国产| 亚洲素人一区二区| 亚洲专区一二三| 亚洲免费中文字幕| 精品一二线国产| 日韩美女视频一区二区在线观看| 国产中文在线视频| 午夜一区二区三区免费| 韩国v欧美v日本v亚洲| 亚洲成av人综合在线观看| 国产视频2区| av中文网站| av免费不卡国产观看| 一区在线视频观看| 欧美日韩在线精品一区二区三区激情综| 欧美日韩国产一二| 亚洲视频日韩| 亚洲国产欧美久久| 日韩中文字幕第一页| 日韩av一区二区在线| 亚洲天堂国产视频| 在线日韩中文| 在线资源av| 最近中文字幕日韩精品| 亚洲精品欧美二区三区中文字幕| 美国av一区二区| 一区视频在线播放| 亚洲视频在线观看日本a| 欧美午夜影院在线视频| 免费在线亚洲| 国产成人精品免费久久久久| 国产欧美日韩精品在线观看| 欧美xxxx中国| 欧美日韩高清不卡| 91极品视频在线观看| 在线欧美一级视频| 国产成人精品综合久久久| 久久99精品久久久久子伦| 欧美三级精品| 亚洲理论中文字幕| 高清一区二区| 国产一级粉嫩xxxx| 国产乱国产乱300精品| 99视频在线看| 国产一区不卡精品| 日韩精品视频网| 国产一级片播放| 亚洲免费在线视频一区 二区| 一区二区欧美国产| 欧美日韩精品中文字幕| 日韩三级视频在线| 中文字幕一区二区三区精品| 精品国产欧美| 亚洲第一香蕉网| 精品成人久久av| 国产一区在线观看视频| 亚洲视频在线观看日本a| 欧美在线视频第一页| 亚洲欧美中文字幕| 免费高清视频日韩| 91精品国产99| 色一区在线观看| 亚洲人成欧美中文字幕| 高清在线一区| 国产网站欧美日韩免费精品在线观看| 最近中文字幕在线中文视频| 国产乱码在线观看| 国产日产一区二区三区| 久99久视频| 国产www在线观看| 免费精品国产自产拍观看| 二区视频在线观看| 一级免费a一片| 国产欧美久久久久久久久| 精品欧美日韩| 中文国产字幕在线观看| 久久人人88| 欧美激情一区二区三区在线| 亚洲最新免费视频| 国产中文在线视频| 日韩欧美国产不卡| 国产欧美日韩中文| a视频免费看| 久久91精品国产91久久小草| 中文字幕亚洲视频| wwwwww在线观看| 日韩综合精品| 国产三级精品网站| 亚洲黄页一区| 久久蜜桃一区二区| 久久精品国产成人一区二区三区| 国产99对白在线播放| 樱花草www在线| 国产一级在线| 一区二区中文字幕在线| 欧美一级二级三级区| 日本精品在线播放| 麻豆精品99| 国产中文伊人| 日韩不卡av| 中文字幕人成乱码在线观看| 精品欧美日韩精品| 国产一级免费在线观看| 日韩欧美在线综合网| 日韩欧美在线精品| 人人做人人澡人人爽欧美| 国产91久久久久蜜臀青青天草二| 国产字幕在线看| www高清在线视频日韩欧美| 国内精品露脸在线视频播放| 中文字幕亚洲区| 国产九九在线| 亚洲综合欧美在线| 欧美日韩成人一区| 亚洲素人一区二区| 尤物av一区二区| 亚洲大胆人体av| 久久精品免费看| 99视频一区| 免费看ww视频网站入口| 一级片免费在线播放| 国产成人精品网址| 日韩欧美一二三| av免费不卡国产观看| 中文字幕精品亚洲| 中文字幕 欧美 日韩| 中文字幕精品一区二区三区在线| 日韩欧美亚洲日产国| 欧美 中文字幕| 亚洲三级av| 亚洲第一视频网站| 激情久久99| 亚洲 欧美综合在线网络| a√免费观看在线网址www| 77777_亚洲午夜久久多人| 精品视频123区在线观看| 日韩精品视频在线观看免费| 色综合影院在线| 日韩亚洲不卡在线| 国产欧美久久久久久久久| av首页在线| 欧美日韩亚洲系列| 欧美日韩三级在线观看| 欧美日韩在线播放一区| 欧美日韩国产区| 欧美 日韩 中文字幕| 国产三级视频在线| 日韩av一区二| 亚洲成av人片在线| 中文字幕在线精品| 国产高清在线一区| av免费网站在线观看| 亚洲免费在线视频一区 二区| 国产福利在线导航| 精品国产91| 国产不卡在线| 午夜精品一区二区三区视频免费看| 国产在线不卡av| 丰满少妇一区| 日韩在线观看视频一区二区| 日韩av中文字幕一区| 在线观看国产一级片| 91精品国产综合久久久久久漫画| 免费国产h视频在线观看86| 精品九九久久| 人成在线免费视频| 欧美亚洲天堂| 婷婷久久综合网| 国产九九在线| 精品一二三区视频| 日韩欧美国产不卡| www.eeuss影院| 国产在线不卡av| 欧美日韩中文字幕在线观看| 日本亚洲欧美| 婷婷久久综合网| a天堂中文在线官网在线| 欧美日韩在线不卡一区| 99热最新网址| 中文字幕亚洲一区在线观看| 亚洲 欧美 精品| 免费在线视频一区二区| 欧美日韩在线国产| 日韩欧美三级视频| 欧美婷婷精品激情| 中文字幕成人乱码在线电影| 欧美日韩国产第一页| 免费视频二区| 国产福利三区| 日韩欧美在线字幕| 国产成人精品999| 日本不卡视频一区| 中文字幕在线观看视频www| 国产在线小视频| 美女尤物久久精品| 国产丝袜一区| 午夜伊人狠狠久久| 中文字幕狠狠干| 国产免费一级| 国产欧美日韩不卡免费| 欧美日韩国产综合久久| 亚洲a一级视频| 欧美一级久久久久久久久大| 日韩三级视频中文字幕| 日韩一级免费在线观看| 国产香蕉精品视频| 深夜日韩欧美| 欧美 日韩 国产 高清| 欧美亚洲天堂网| 国产劲爆久久| 欧美在线亚洲一区| 亚洲免费观看在线观看| 中文字幕视频在线免费欧美日韩综合在线看 | 欧美日韩综合视频| 首页国产欧美久久| 欧美日韩尤物久久| 亚洲欧洲国产视频| a天堂中文在线官网在线| 中文字幕在线视频精品| 久久riav| 91久久精品午夜一区二区| 日韩精品视频中文在线观看| 免费在线视频一级不卡| 精品久久香蕉国产线看观看gif | 日韩色在线观看| 中文天堂资源在线| 日韩在线观看精品| 日韩欧美国产黄色| 亚洲va久久久噜噜噜久久| 日韩三级一区二区| 欧美日韩激情一区二区三区| 亚洲一区中文| 日韩在线视频精品| 精品极品三级久久久久| 国产欧美第一页| 国产欧美日韩久久| 亚洲视频在线观看三级| 日韩视频一区在线观看| 日韩精品在线网站| 日韩欧美国产午夜精品| 日韩欧美国产成人一区二区| 欧美久久久网站| 国产亚洲污的网站| 日本视频久久久| 国产三级视频在线播放线观看| 一区二区日韩视频| 久本草在线中文字幕亚洲欧美| 欧洲精品二区| 1024国产在线| 色www精品视频在线观看| 欧美日韩99| 日韩亚洲一区中文字幕| 国产最顶级的黄色片在线免费观看| 日本a口亚洲| 亚洲一区二区三区精品中文字幕| 国产最新在线| 久久婷婷国产| 中文字幕在线中文字幕二区| 91蜜桃在线视频| 国产资源在线观看| 亚洲免费在线视频一区 二区| 一级片在线播放| 99综合精品久久| 日韩欧美在线看| 欧美日韩乱国产| 日韩字幕在线观看| 日韩在线不卡| 午夜精品免费视频| 中文在线不卡| 欧美日韩亚洲第一| 99视频精品全国免费| 国产日韩av一区| 亚洲高清在线观看一区| 国产黄色高清在线| 国产一二三区精品视频| 久久99精品久久久| 日韩精品丝袜在线| 日韩中文欧美| 欧美日韩精品在线| 欧美日韩在线不卡| 日韩不卡一二三区| 国产欧美日韩中文久久| 国产午夜精品久久| 日韩av一区二区在线观看| av免费不卡国产观看| 91亚洲国产| 日韩欧美中文在线| 中文字幕亚洲区| 国产传媒久久久| 最新中文字幕在线播放| 久久激情一区| www.久久久精品| 国产激情99| 日韩在线中文| 国产亚洲人成a一在线v站| 在线一区二区三区精品| 在线国产99| 国产95在线|亚洲| 国产高清视频一区二区| 日韩欧美在线中文字幕| 免费国产成人看片在线| 亚洲国产91精品在线观看| 亚洲国产一区自拍| 国产欧美第一页| 91久久精品国产91性色69| 欧美日韩亚洲一| 日韩视频一区| 日韩在线高清| 精品日韩在线观看| 欧美不卡123| 欧美日韩综合视频| 欧美日韩国产免费| 亚洲免费观看视频| 尤物av一区二区| 欧美日韩亚洲系列| 日韩精品视频免费在线观看| 国产在线播放一区二区| 日韩www在线| 一区二区不卡在线播放| 精品视频—区二区三区免费| 在线视频不卡一区二区| 欧美不卡视频一区| 国产亚洲污的网站| 精品一二三四| 视频一区二区精品的福利| 日韩在线视频在线观看| 欧美高清一级片在线| 欧美三级三级三级爽爽爽| 国产三级在线观看视频| 最近免费中文字幕在线第一页| a视频在线播放| 久久久综合精品| √天堂资源中文www| 久久精品欧美日韩精品| 精品国产99久久久久久 | 日本精品二区| 国产福利一区二区精品秒拍| 一级特黄大欧美久久久| 青青久在线视频免费观看| 国产一区久久久| 日韩欧美在线中字| 国产三级在线| 日韩视频在线一区| 一区二区三区在线播放欧美| 国产欧美日韩91| 日韩三级在线播放| 91精品国产免费久久综合| 日韩欧美高清在线| 最近中文字幕在线中文高清版| 欧美三级在线看| 亚洲视频在线观看三级| 日本亚洲视频在线|