西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)java → Java字符串處理String、StringBuilder、StringBuffer類效率分析

Java字符串處理String、StringBuilder、StringBuffer類效率分析

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2012/12/10 19:30:15字體大。A-A+

作者:西西點(diǎn)擊:753次評(píng)論:0次標(biāo)簽: 字符串

字符串加密v1.0安卓版
  • 類型:安全相關(guān)大小:2.9M語言:中文 評(píng)分:10.0
  • 標(biāo)簽:
立即下載

字符串操作是編寫程序中最常見的行為,本文對(duì)String、StringBuilder、StringBuffer三個(gè)類在字符串處理方面的效率進(jìn)行分析。

Java中最常見也是應(yīng)用最廣泛的類就是String類。

String:Strings are constant; their values cannot be changed after they are created.

這是JDK對(duì)String的解釋,意思是:String是常量,一旦創(chuàng)建后它的值不能被修改。

先看String對(duì)象是如何創(chuàng)建的:

String str1 = “abc”;

String str2 = new String(“abc”);

這是我們常見的兩種形式。

第一種方式創(chuàng)建的字符串會(huì)放在棧里,更確切的是常量池中,常量池就是用來保存在編譯階段確定好了大小的數(shù)據(jù),一般我們定義的int等基本數(shù)據(jù)類型就保存在這里。其具體的一個(gè)流程就是,編譯器首先檢查常量池,看看有沒有一個(gè)“abc”,如果沒有則創(chuàng)建。如果有的話,則則直接把str1指向那個(gè)位置。

第二種創(chuàng)建字符串的方法是通過new關(guān)鍵字,還是java的內(nèi)存分配,java會(huì)將new的對(duì)象放在堆中,這一部分對(duì)象是在運(yùn)行時(shí)創(chuàng)建的對(duì)象。所以我們每一次new的時(shí)候,都會(huì)創(chuàng)建不同的對(duì)象,即便是堆中已經(jīng)有了一個(gè)一模一樣的。

下面的程序?qū)Ⅱ?yàn)證上面的說法。

1 String str1 = "abc";
2 String str2 = new String("abc");
3
4 String str3 = "abc";
5 String str4 = new String("abc");
6
7 System.out.println(str1==str2);//false
8   
9 System.out.println(str1 == str3);//true
10 System.out.println(str2 == str4);//false
11 // When the intern method is invoked, if the pool already contains a
12 // string equal to this String object as determined by the
13 // equals(Object) method, then the string from the pool is returned.
14 // Otherwise, this String object is added to the pool and a reference to
15 // this String object is returned.
16 str2 = str2.intern();
17 System.out.println(str1==str2);//true
18
19 false
20 true
21 false
22 true

以上程序中用兩種方式創(chuàng)建的4個(gè)對(duì)象,”==”比較的是地址,從結(jié)果可以看到str1和str3相同,指向同一個(gè)對(duì)象。而str2和str4比較返回結(jié)果是false,說明str2和str4指向的不是同一個(gè)對(duì)象。

(上面用到了一個(gè)比較少見的方法:intern。在str2調(diào)用了intern方法后對(duì)str1和str2進(jìn)行比較返回true,可以從代碼注釋中看明白,intern方法返回常量池中內(nèi)容和該對(duì)象相同的對(duì)象,如果常量池中不存在,則將該對(duì)象加入到常量池中。)

String對(duì)象是不變的,那為什么可以進(jìn)行str+=”abc”這樣的操作?其實(shí)類似這樣的操作是新生成了一個(gè)String對(duì)象,包含str和abc連接后的字符串。

1 package test;
2
3 public class StringTest {
4public static void main(String[] args) {
5    String str1 = "abc";
6    str1 += "123";
7}
8 }

從編譯之后的class可以看出編譯器自動(dòng)引入了StringBuilder類,通過它的初始化方法創(chuàng)建了StringBuilder對(duì)象,通過append方法添加了內(nèi)容,調(diào)用toString返回連接后的對(duì)象。以上內(nèi)容證明了String對(duì)象是不可變的,連接操作實(shí)際是返回了新的對(duì)象。如果是循環(huán)多次進(jìn)行連接,將不斷的創(chuàng)建StringBuilder對(duì)象,append新內(nèi)容,toString成String對(duì)象。這就帶來了String類處理字符串更改操作的效率問題。

1 public class StringTest {
2public static void main(String[] args) {
3    long start, end;
4
5    StringBuilder strBuilder = new StringBuilder(" ");
6    start = System.currentTimeMillis();
7    for (int i = 0; i < 100000; i++) {
8   strBuilder.append(" ");
9    }
10    end = System.currentTimeMillis();
11    System.out.println("StringBuilder append: " + (end - start) + "ms");
12
13    String str = " ";
14    start = System.currentTimeMillis();
15    for (int i = 0; i < 100000; i++) {
16   str += " ";
17    }
18    end = System.currentTimeMillis();
19    System.out.println("String +: " + (end - start) + "ms");
20}
21 }

可以看到String和StringBuilder在效率方便的差距。

StringBuffer:A thread-safe, mutable sequence of characters. A string buffer is like a String, but can be modified.

StringBuilder:A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization.

StringBuffer是可變的、線程安全的字符串。StringBuilder就是StringBuffer的非線程同步的版本,二者的方法差不多,只是一個(gè)線程安全(適用于多線程)一個(gè)沒有線程安全(適用于單線程)。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)