(一)三者速度比較
-
String:(遍歷100萬次)
String aa = ""; long startTime = System.currentTimeMillis(); for(int i=0;i<100*100*10;i++){ //字符串拼接 aa = aa + "aa"; } long endTime = System.currentTimeMillis(); System.out.println("耗時(shí):"+String.valueOf(endTime - startTime));
運(yùn)行結(jié)果:
耗時(shí):7614
-
StringBuffer:(遍歷一億次)
StringBuffer aa = new StringBuffer(); String ss = "ss"; long startTime = System.currentTimeMillis(); for(int i=0;i<100*100*100*100;i++){ //字符串拼接 aa.append(ss); } long endTime = System.currentTimeMillis(); System.out.println("耗時(shí):"+String.valueOf(endTime - startTime));
運(yùn)行結(jié)果:
耗時(shí):3128
-
StringBuilder:(遍歷一億次)
StringBuilder aa = new StringBuilder(); String ss = "ss"; long startTime = System.currentTimeMillis(); for(int i=0;i<100*100*100*100;i++){ //字符串拼接 aa.append(ss); } long endTime = System.currentTimeMillis(); System.out.println("耗時(shí):"+String.valueOf(endTime - startTime));
運(yùn)行結(jié)果:
耗時(shí):1240
結(jié)論:
(1)速度比較:String < StringBuffer < StringBuilder
(2)String的處理速度比StringBuffer、StringBuilder要慢的多。
(二)String的處理速度為什么要比StringBuffer、StringBuilder慢的多?
- String是不可變的對(duì)象
- StringBuffer是可變對(duì)象
- StringBuilder是可變對(duì)象
請(qǐng)結(jié)合上面的代碼理解這個(gè)問題:
(1)String本身就是一個(gè)對(duì)象,因?yàn)镾tring不可變對(duì)象,所以,每次遍歷對(duì)字符串做拼接操作,都會(huì)重新創(chuàng)建一個(gè)對(duì)象,循環(huán)100萬次就是創(chuàng)建100萬個(gè)對(duì)象,非常的消耗內(nèi)存空間,而且創(chuàng)建對(duì)象本身就是一個(gè)耗時(shí)操作,創(chuàng)建100萬次對(duì)象就相當(dāng)?shù)暮臅r(shí)了。
(2)StringBuffer和StringBuilder只需要?jiǎng)?chuàng)建一個(gè)StringBuffer或StringBuilder對(duì)象,然后用append拼接字符串,就算拼接一億次,仍然只有一個(gè)對(duì)象。
(三)是不是可以拋棄使用String,轉(zhuǎn)而使用StringBuffer和StringBuilder呢?
答案是否定的。
上文的總結(jié)只是針對(duì)于數(shù)據(jù)量比較多的情況,但是數(shù)據(jù)量比較少的情況呢?
我們分析一下代碼:
(1)String遍歷代碼:一開始定義一個(gè)String常量(創(chuàng)建一個(gè)String對(duì)象), 再開始遍歷;
(2)StringBuffer代碼:一開始定義一個(gè)String常量(創(chuàng)建一個(gè)String對(duì)象)和一個(gè)創(chuàng)建StringBuffer對(duì)象,再開始遍歷;
(3)StringBuiler代碼:一開始定義一個(gè)String常量(創(chuàng)建一個(gè)String對(duì)象)和一個(gè)創(chuàng)建StringBuiler對(duì)象,再開始遍歷;
(2)和(3)比(1)多了一個(gè)創(chuàng)建對(duì)象流程,所以,如果數(shù)據(jù)量比較小的情況建議使用String。
(四)是StringBuffer和StringBuilder的區(qū)別?
- StringBuffer是線程安全的
- StringBuilder是非線程安全的, 這也是速度比StringBuffer快的原因
注:不知道線程安全的可以自行查找資料補(bǔ)腦
(五)使用場景
(1)如果要操作少量的數(shù)據(jù)用 String
(2)單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) StringBuilder
(3)多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) StringBuffer