優雅編程之這樣考慮字符性能,你就“正常”了(二十二)

開心一笑

【吃過晚飯在客廳看報紙,問老婆:你洗碗了嗎? 老婆嚴肅的說:老公,你應該這樣問,寶貝,我去幫你洗碗吧!然后我再說,老公,已經洗好了。這樣顯著多好…… 于是,老公:寶貝,我去幫你洗碗吧!老婆:恩,去吧。】

提出問題

項目中字符串操作應該注意的一些性能問題???

解決問題

勵志圖片

以下來自《Java程序性能優化》這本書中的一點總結,以及自己的想法,每篇文章都很短,不太喜歡寫太多,一步一步慢慢學就可以了:

String類的基本實現:char數組,offset偏移量和String的count長度

對String優化主要表現在3個方面,同時也是String對象的3個特點:

  • 不變性:String對象一旦生成,則不能再對它進行改變。
  • 針對常量池的優化。
  • 類的final定義。

例一:

@Test
public void testString(){
    String boy = "boy";
    String girl = "girl";
    String girl2 = "girl";
    String girl3 = new String("girl");
    System.out.println(boy == girl);//false
    System.out.println(girl == girl2);//true
    System.out.println(girl == girl3);//false
    System.out.println(girl == girl3.intern());//true

}
引用Java程序性能優化圖片

subString內存泄露問題

具體可以看高手文章:

http://www.cnblogs.com/techyc/p/3324021.html

在jdk6中,substring還是指向原來的字符串,可以用 new String(str.substring())避免內存泄露,
在jdk7中,沒有這個問題

字符串分割和查找

使用效率更高的StringTokenizer類分割字符

例二:

@Test
public void testString(){

    String originalStr = null;
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<10000;i++){
        sb.append("ay");
        sb.append(";");
    }
    originalStr = sb.toString();

    long startTime = System.currentTimeMillis();
    for(int i=0;i<10000;i++){
        //在這里分割10000次
        originalStr.split(";");
    }
    System.out.println(System.currentTimeMillis() - startTime);

}

結果花費:14920ms(我電腦比較 lan )

性能改造:

@Test
public void testString(){
    String originalStr = null;
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<10000;i++){
        sb.append("ay");
        sb.append(";");
    }
    originalStr = sb.toString();
    long startTime = System.currentTimeMillis();

    StringTokenizer tokenizer = new StringTokenizer(originalStr,";");
    for(int i=0;i<10000;i++){
        while (tokenizer.hasMoreTokens()){
            tokenizer.nextToken();
        }
    }
    System.out.println(System.currentTimeMillis() - startTime);
}

結果花費:8ms(我電腦比較 lan ) 這不是一個等級的啊!get起來

高效率的charAt()方法

charAt()效率比startsWith()或者endsWith效率高,對于判斷單個字符開頭的還可以,對于多個的話,我測試下,效率并沒有高很多。

例三:

@Test
public void testString3(){

    String loveStr = "Love you!!!";
    long startTime = System.currentTimeMillis();
    //執行100萬次
    for(int i=0;i<1000000;i++){
        //判斷是否以L開頭
        if(loveStr.charAt(0) == 'L'
                ){
        }
    }
    System.out.println(System.currentTimeMillis() - startTime);
}

結果花費:20ms

@Test
public void testString4(){

    String loveStr = "Love you!!!";
    long startTime = System.currentTimeMillis();
    //執行100萬次
    for(int i=0;i<1000000;i++){
        //判斷是否以L開頭
        if(loveStr.startsWith("L")){
        }
    }
    System.out.println(System.currentTimeMillis() - startTime);
}

結果花費:27ms

StringBuffer和StringBuilder

String對象是不可變對象,因此在需要對字符串進行修改操作時,如字符串連接,替換,String對象總是會生成新的對象,所以其性能相對較差。

例四:

String love = "999玫瑰" + "999電話" + "999晚安" + "999早安";

StringBuilder result = new StringBuilder();
result.append("999玫瑰");
result.append("999電話");
result.append("999晚安");
result.append("999早安");

因為java虛擬機對String拼接進行性能的優化。將多個連接操作的字符串,在編譯時合成一個單獨的長字符串。所以上面二者效率差不多

雖然二者的性能差不多,但是作者還是建議在代碼的實現中盡量地使用StringBuilder或者StringBuffer,來提升程序性能,而不是依靠編譯器對程序進行優化。

例五:

// 1
for(int i=0;i<10000;i++){
    str = str + i;
}

//編譯器會把上面代碼編譯成以下代碼,但是每次會新建一個 StringBuilder對象,效率自然就低了
for(int i=0;i<10000;i++){
    str = (new StringBuilder(String.valueOf(str))).append(i).toString();
}

// 2
for(int i=0;i<10000;i++){
    result = result.concat(String.valueOf(i));
}

// 3
StringBuilder sb = new StringBuilder();
for(int i=0;i<10000;i++){
    sb.append(i);

` }

上面的三個方法中效率(由低到高):

1 < 2 < 3

雖然java虛擬機會String的加法操作進行優化,但是編譯器還是不夠聰明。

StringBuffer和StringBuilder的選擇

StringBuffer和StringBuilder是一對孿生兄弟。

StringBuilder的效率 > StringBuffer的效率

StringBuilder是非線程安全的。StringBuffer是線程安全的。

可見一陰一陽之謂道,在任何地方都體現得淋漓盡致。

讀書感悟

來自張小嫻《面包樹上的女人》

  • 想要忘記一段感情,方法永遠只有一個:時間和新歡。要是時間和新歡也不能讓你忘記一段感情,原因只有一個:時間不夠長,新歡不夠好。

  • 我把青春投資在他身上,他成功了,也許會愛上另一個女人。他失敗了,我 一無所有。
    愛情太不可靠了,只有事業才是一份耕耘一份收獲的,我想有自己的事業。

  • 不能把你留在身邊,不是你的過錯,而是我的失敗。在你曾經愛過我的那些短暫歲月里,我或許是世界上最幸福的人,只是那些日子已成過去,要留也留不住。我知道愛不可以乞求,如果我能夠為你做一件事,便是等待。

  • 一個男人,泥足深陷地愛上一個不愛他的女人,注定要放棄自尊.

  • 所有為愛而做的事,都不是壞事.

  • 那時,我已經明白,作為一個女人,你最好很出色,或者很漂亮

其他

如果有帶給你一絲絲小快樂,就讓快樂繼續傳遞下去,歡迎轉載,點贊,頂,歡迎留下寶貴的意見,多謝支持!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,726評論 18 399
  • 一、String 類 1、定義: 1、從概念上講,java字符串就是Unicode字符序列。每個用雙引號括起來的字...
    玉圣閱讀 1,589評論 0 1
  • Tip:筆者馬上畢業了,準備開始 Java 的進階學習計劃。于是打算先從 String 類的源碼分析入手,作為后面...
    石先閱讀 12,033評論 16 58
  • 【大福建地區的娛玩樂事,都在這里了。微信訂閱,“福建娛玩”,獲取更多】 離雙十一越來越近,福州的實體百貨賣場也按捺...
    福建娛玩閱讀 216評論 0 0
  • 我們單位還沒有開通微信支付和支付寶支付,所以很多人沒有錢的時候,會用微信或者支付寶轉給我們,我們再 把現金給他們去...
    開心的靈通閱讀 303評論 0 0