濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > StringBuider 在什么條件下、如何使用效率更高

StringBuider 在什么條件下、如何使用效率更高

熱門標(biāo)簽:聯(lián)通外呼系統(tǒng)電腦app軟件 400電話申請(qǐng)到底哪家好 鶴壁高頻外呼系統(tǒng)多少錢一個(gè)月 地圖標(biāo)注項(xiàng)目幾個(gè)月 宿遷怎么辦理400電話 400電話辦理費(fèi)用低 蘇州呼叫中心外呼系統(tǒng)哪家強(qiáng) 谷歌地圖標(biāo)注日期 外呼系統(tǒng)怎么群發(fā)短信

引言

都說 StringBuilder 在處理字符串拼接上效率要強(qiáng)于 String,但有時(shí)候我們的理解可能會(huì)存在一定的偏差。最近我在測(cè)試數(shù)據(jù)導(dǎo)入效率的時(shí)候就發(fā)現(xiàn)我以前對(duì) StringBuilder 的部分理解是錯(cuò)誤的。 后來我通過實(shí)踐測(cè)試 + 找原理 的方式搞清楚了這塊的邏輯?,F(xiàn)在將過程分享給大家

測(cè)試用例

我們的代碼在循環(huán)中拼接字符串一般有兩種情況

第一種就是每次循環(huán)將對(duì)象中的幾個(gè)字段拼接成一個(gè)新字段,再賦值給對(duì)象第二種操作是在循環(huán)外創(chuàng)建一個(gè)字符串對(duì)象,每次循環(huán)向該字符串拼接新的內(nèi)容。循環(huán)結(jié)束后得到拼接好的字符串

對(duì)于這兩種情況,我創(chuàng)建了兩個(gè)對(duì)照組

第一組:

在每次 For 循環(huán)中拼接字符串,即拼即用、用完即毀。分別使用 String 和 StringBuilder 拼接

 /**
  * 循環(huán)內(nèi) String 拼接字符串,一次循環(huán)后銷毀
  */
 public static void useString(){
  for (int i = 0; i  CYCLE_NUM_BIGGER; i++) {
   String str = str1 + i + str2 + i + str3 + i + str4 ;
  }
 }

 /**
  * 循環(huán)內(nèi) 使用 StringBuilder 拼接字符串,一次循環(huán)后銷毀
  */
 public static void useStringBuilder(){
  for (int i = 0; i  CYCLE_NUM_BIGGER; i++) {
   StringBuilder sb = new StringBuilder();
   String s = sb.append(str1).append(i).append(str2).append(i).append(str3).append(i).append(str4).toString();
  }
 }

第二組:

多次 For 循環(huán)拼接一個(gè)字符串,循環(huán)結(jié)束后使用字符串,使用后由垃圾回收器回收。也是分別使用 String 和 StringBuilder 拼接

 /**
  * 多次循環(huán)拼接成一個(gè)字符串 用 String
  */
 public static void useStringSpliceOneStr (){
  String str = "";
  for (int i = 0; i  CYCLE_NUM_LOWER; i++) {
   str += str1 + str2 + str3 + str4 + i;
  }
 }

 /**
  * 多次循環(huán)拼接成一個(gè)字符串 用 StringBuilder
  */
 public static void useStringBuilderSpliceOneStr(){
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i  CYCLE_NUM_LOWER; i++) {
   sb.append(str1).append(str2).append(str3).append(str4).append(i);
  }
 }

為了保證測(cè)試質(zhì)量,在每個(gè)測(cè)試項(xiàng)目進(jìn)行前。線程休息 2s,之后空跑 5 次熱身。最后執(zhí)行 5 次求平均時(shí)間的方式計(jì)算時(shí)間

 public static int executeSometime(int kind, int num) throws InterruptedException {
  Thread.sleep(2000);
  int sum = 0;
  for (int i = 0; i  num + 5; i++) {
   long begin = System.currentTimeMillis();

   switch (kind){
    case 1:
     useString();
     break;
    case 2:
     useStringBuilder();
     break;
    case 3:
     useStringSpliceOneStr();
     break;
    case 4:
     useStringBuilderSpliceOneStr();
     break;
    default:
     return 0;
   }

   long end = System.currentTimeMillis();

   if(i > 5){
    sum += (end - begin);
   }
  }
  return sum / num;
 }

主方法

public class StringTest {
 public static final int CYCLE_NUM_BIGGER = 10_000_000;
 public static final int CYCLE_NUM_LOWER = 10_000;
 public static final String str1 = "張三";
 public static final String str2 = "李四";
 public static final String str3 = "王五";
 public static final String str4 = "趙六";


 public static void main(String[] args) throws InterruptedException {
  int time = 0;
  int num = 5;

  time = executeSometime(1, num);
  System.out.println("String拼接 "+ CYCLE_NUM_BIGGER +" 次," + num + "次平均時(shí)間:" + time + " ms");

  time = executeSometime(2, num);
  System.out.println("StringBuilder拼接 "+ CYCLE_NUM_BIGGER +" 次," + num + "次平均時(shí)間:" + time + " ms");

  time = executeSometime(3, num);
  System.out.println("String拼接單個(gè)字符串 "+ CYCLE_NUM_LOWER +" 次," + num + "次平均時(shí)間:" + time + " ms");

  time = executeSometime(4, num);
  System.out.println("StringBuilder拼接單個(gè)字符串 "+ CYCLE_NUM_LOWER +" 次," + num + "次平均時(shí)間:" + time + " ms");

 }
} 

測(cè)試結(jié)果

測(cè)試結(jié)果如下

結(jié)果分析

第一組

10_000_000 次循環(huán)拼接,在循環(huán)內(nèi)使用 String 和 StringBuilder 的效率是一樣的!為什么呢?

使用 javap -c StringTest.class 反編譯查看兩個(gè)方法編譯后的文件:

可以發(fā)現(xiàn) String 方法拼接字符串編譯器優(yōu)化后使用的就是 StringBuilder、因此用例1 和用例2 的效率是一樣的。

第二組

第二組的結(jié)果就是大家喜聞樂見的了,由于 10_000_000 次循環(huán)String 拼接實(shí)在太慢所以我采用了 10_000 次拼接來分析。

分析用例3:雖然編譯器會(huì)對(duì) String 拼接做優(yōu)化,但是它每次在循環(huán)內(nèi)創(chuàng)建 StringBuilder 對(duì)象,在循環(huán)內(nèi)銷毀。下次循環(huán)他有創(chuàng)建。相比較用例4在循環(huán)外創(chuàng)建,多了 n 次 new 對(duì)象、銷毀對(duì)象的操作、n - 1 次將 StringBuilder 轉(zhuǎn)換成 String 的操作 。效率低也是理所應(yīng)當(dāng)了。

擴(kuò)展

第一組的測(cè)試還有一種寫法:

 /**
  * 循環(huán)內(nèi) 使用 StringBuilder 拼接字符串,一次循環(huán)后銷毀
  */
 public static void useStringBuilderOut(){
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i  CYCLE_NUM_BIGGER; i++) {
//   sb.setLength(0);
   sb.delete(0, sb.length());
   String s = sb.append(str1).append(i).append(str2).append(i).append(str3).append(i).append(str4).toString();
  }
 }

循環(huán)外創(chuàng)建 StringBuilder 每次循環(huán)開始的時(shí)候清空 StringBuilder 的內(nèi)容然后拼接。這種寫法無論使用 sb.setLength(0); 還是 sb.delete(0, sb.length()); 效率都比直接在循環(huán)內(nèi)使用 String / StringBuilder 慢。奈何才疏學(xué)淺我一直想不明白為什么他慢。我猜測(cè)是 new 對(duì)象的速度比重置長(zhǎng)度慢,于是這樣測(cè)試了以下:

 public static void createStringBuider() {
  for (int i = 0; i  CYCLE_NUM_BIGGER; i++) {
   StringBuilder sb = new StringBuilder();
  }
 }

 public static void cleanStringBuider() {
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i  CYCLE_NUM_BIGGER; i++) {
   sb.delete(0, sb.length());
  }
 }

但是結(jié)果是 cleanStringBuider 更快。讓我摸不著頭腦

如果有大神看到希望可以幫忙分析分析

結(jié)論

編譯器會(huì)將 String 拼接優(yōu)化成使用 StringBuilder,但是還是有一些缺陷的。主要體現(xiàn)在循環(huán)內(nèi)使用字符串拼接,編譯器不會(huì)創(chuàng)建單個(gè) StringBuilder 以復(fù)用

對(duì)于多次循環(huán)內(nèi)拼接一個(gè)字符串的需求:StringBuilder 很快,因?yàn)槠浔苊饬?n 次 new 對(duì)象、銷毀對(duì)象的操作,n - 1 次將 StringBuilder 轉(zhuǎn)換成 String 的操作

StringBuilder 拼接不適用于循環(huán)內(nèi)每次拼接即用的操作方式。因?yàn)榫幾g器優(yōu)化后的 String 拼接也是使用 StringBuilder 兩者的效率一樣。后者寫起來還方便...

到此這篇關(guān)于StringBuider 在什么條件下、如何使用效率更高?的文章就介紹到這了,更多相關(guān)StringBuider如何使用效率更高內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 深入解析Java編程中的StringBuffer與StringBuider

標(biāo)簽:莆田 哈爾濱 錫林郭勒盟 鄂爾多斯 丹東 遵義 襄陽(yáng) 雙鴨山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《StringBuider 在什么條件下、如何使用效率更高》,本文關(guān)鍵詞  StringBuider,在什么,條件下,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《StringBuider 在什么條件下、如何使用效率更高》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于StringBuider 在什么條件下、如何使用效率更高的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    永吉县| 兰溪市| 万宁市| 广丰县| 集贤县| 台州市| 唐山市| 班玛县| 青河县| 曲松县| 青海省| 高州市| 仪征市| 宜君县| 平湖市| 巴林左旗| 三亚市| 思茅市| 华安县| 布拖县| 米脂县| 西城区| 项城市| 邛崃市| 长武县| 腾冲县| 绿春县| 黄平县| 舞钢市| 邛崃市| 米林县| 华池县| 城步| 五河县| 兴业县| 珠海市| 正镶白旗| 芦山县| 汉阴县| 广灵县| 柏乡县|