java String和StringBuffer的區別

在java中有3個類來負責字符的操作。

1.Character 是進行單個字符操作的,

2.String 對一串字符進行操作。不可變類。

3.StringBuffer 也是對一串字符進行操作,但是可變類。

String:
是對象不是原始類型.
為不可變對象,一旦被創建,就不能修改它的值.
對于已經存在的String對象的修改都是重新創建一個新的對象,然后把新的值保存進去.
String 是final類,即不能被繼承.

StringBuffer:
是一個可變對象,當對他進行修改的時候不會像String那樣重新建立對象
它只能通過來建立,
StringBuffer sb = new StringBuffer();
note:不能通過付值符號對他進行付值.?
sb = "welcome to here!";//error
對象被建立以后,在中就會分配內存空間,并初始保存一個null.向StringBuffer
中付值的時候可以通過它的append方法.
sb.append("hello");

字符串連接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的處理步驟實際上是通過建立一個StringBuffer,讓侯調用append(),最后
再將StringBuffer toSting();
這樣的話String的連接操作就比StringBuffer多出了一些附加操作,當然效率上要打折扣.

并且由于String 對象是不可變對象,每次操作Sting 都會重新建立新的對象來保存新的值.
這樣原來的對象就沒用了,就要被垃圾回收.這也是要影響性能的.?

?

String專門定義不變字符串,而StingBuffer用來定義可變字符串。?
兩者在性能上也有很大的區別:?
String比較適合短的字符串,StingBuffer適合動態增加的字符串。?
在實際使用過程中,要求:String+String這種在BS開發結構中不被提倡,對性能影響比較大。而StingBuffer則是比較推薦。?
類似的不提倡使用的還有System.out.print()方法


?

String ? s ? ;?
每次對s進行賦值操作是都將生成一個新的String實例;?
StingBuffer ? sb;?
sb則不然,它始終是同一個實例?
所以在經常動態的改變字符串的值是用StingBuffer效率比較高,java生成一個實例的代價較大。


?

看看以下代碼:
將26個英文字母重復加了5000次,

????????String?tempstr?=?"abcdefghijklmnopqrstuvwxyz";

????????int?times?=?5000;

????????long?lstart1?=?System.currentTimeMillis();

????????String?str?=?"";

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

????????????str?+=?tempstr;

????????}

????????long?lend1?=?System.currentTimeMillis();

????????long?time?=?(lend1?-?lstart1);

????????System.out.println(time);

可惜我的計算機不是超級計算機,得到的結果每次不一定一樣一般為 46687左右。
也就是46秒。
我們再看看以下代碼

????????String?tempstr?=?"abcdefghijklmnopqrstuvwxyz";

????????int?times?=?5000;

????????long?lstart2?=?System.currentTimeMillis();

????????StringBuffer?sb?=?new?StringBuffer();

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

????????????sb.append(tempstr);

????????}

????????long?lend2?=?System.currentTimeMillis();

????????long?time2?=?(lend2?-?lstart2);

????????System.out.println(time2);

得到的結果為 16 有時還是 0
所以結論很明顯,StringBuffer 的速度幾乎是String 上萬倍。當然這個數據不是很準確。因為循環的次數在100000次的時候,差異更大。不信你試試。

?

根據上面所說:

str += "here";
的處理步驟實際上是通過建立一個StringBuffer,讓侯調用append(),最后
再將StringBuffer toSting();

所以str += "here";可以等同于

StringBuffer sb = new StringBuffer(str);

sb.append("here");

str = sb.toString();

所以上面直接利用"+"來連接String的代碼可以基本等同于以下代碼

????????String?tempstr?=?"abcdefghijklmnopqrstuvwxyz";

????????int?times?=?5000;

????????long?lstart2?=?System.currentTimeMillis();

????????String?str?=?"";

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

????????????StringBuffer?sb?=?new?StringBuffer(str);

????????????sb.append(tempstr);

????????????str?=?sb.toString();

????????}

????????long?lend2?=?System.currentTimeMillis();

????????long?time2?=?(lend2?-?lstart2);

????????System.out.println(time2);

平均執行時間為46922左右,也就是46秒。

?

總結: 如果在程序中需要對字符串進行頻繁的修改連接操作的話.使用StringBuffer性能會更高


來源:博客園

上一篇: Oracle中實現分頁的SQL語句和在JSP頁面實現分頁技術

下一篇: Linux學習之安裝jdk

分享到: 更多
双色球重复中奖号码 秒速赛车的漏洞是什么 网络赌博龙虎怎么老输 大乐透怎么加倍投注 北京pk10走势规律分析 pk10六码两期全天计划 北京pk10杀两码技巧 极速pk10计划人工在线计划 微乐二人斗地主规则 计划软件哪个好用 超级大乐透中奖规则图 竞彩计算器 重庆时时开奖官方 马德里竞技 游戏《森林》手机版 创造与魔法pt是什么意思