婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > StringBuider 在什么條件下、如何使用效率更高

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

熱門標簽:聯通外呼系統電腦app軟件 400電話申請到底哪家好 鶴壁高頻外呼系統多少錢一個月 地圖標注項目幾個月 宿遷怎么辦理400電話 400電話辦理費用低 蘇州呼叫中心外呼系統哪家強 谷歌地圖標注日期 外呼系統怎么群發短信

引言

都說 StringBuilder 在處理字符串拼接上效率要強于 String,但有時候我們的理解可能會存在一定的偏差。最近我在測試數據導入效率的時候就發現我以前對 StringBuilder 的部分理解是錯誤的。 后來我通過實踐測試 + 找原理 的方式搞清楚了這塊的邏輯。現在將過程分享給大家

測試用例

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

第一種就是每次循環將對象中的幾個字段拼接成一個新字段,再賦值給對象第二種操作是在循環外創建一個字符串對象,每次循環向該字符串拼接新的內容。循環結束后得到拼接好的字符串

對于這兩種情況,我創建了兩個對照組

第一組:

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

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

 /**
  * 循環內 使用 StringBuilder 拼接字符串,一次循環后銷毀
  */
 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 循環拼接一個字符串,循環結束后使用字符串,使用后由垃圾回收器回收。也是分別使用 String 和 StringBuilder 拼接

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

 /**
  * 多次循環拼接成一個字符串 用 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);
  }
 }

為了保證測試質量,在每個測試項目進行前。線程休息 2s,之后空跑 5 次熱身。最后執行 5 次求平均時間的方式計算時間

 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 + "次平均時間:" + time + " ms");

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

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

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

 }
} 

測試結果

測試結果如下

結果分析

第一組

10_000_000 次循環拼接,在循環內使用 String 和 StringBuilder 的效率是一樣的!為什么呢?

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

可以發現 String 方法拼接字符串編譯器優化后使用的就是 StringBuilder、因此用例1 和用例2 的效率是一樣的。

第二組

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

分析用例3:雖然編譯器會對 String 拼接做優化,但是它每次在循環內創建 StringBuilder 對象,在循環內銷毀。下次循環他有創建。相比較用例4在循環外創建,多了 n 次 new 對象、銷毀對象的操作、n - 1 次將 StringBuilder 轉換成 String 的操作 。效率低也是理所應當了。

擴展

第一組的測試還有一種寫法:

 /**
  * 循環內 使用 StringBuilder 拼接字符串,一次循環后銷毀
  */
 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();
  }
 }

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

 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());
  }
 }

但是結果是 cleanStringBuider 更快。讓我摸不著頭腦

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

結論

編譯器會將 String 拼接優化成使用 StringBuilder,但是還是有一些缺陷的。主要體現在循環內使用字符串拼接,編譯器不會創建單個 StringBuilder 以復用

對于多次循環內拼接一個字符串的需求:StringBuilder 很快,因為其避免了 n 次 new 對象、銷毀對象的操作,n - 1 次將 StringBuilder 轉換成 String 的操作

StringBuilder 拼接不適用于循環內每次拼接即用的操作方式。因為編譯器優化后的 String 拼接也是使用 StringBuilder 兩者的效率一樣。后者寫起來還方便...

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

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

標簽:莆田 哈爾濱 錫林郭勒盟 鄂爾多斯 丹東 遵義 襄陽 雙鴨山

巨人網絡通訊聲明:本文標題《StringBuider 在什么條件下、如何使用效率更高》,本文關鍵詞  StringBuider,在什么,條件下,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《StringBuider 在什么條件下、如何使用效率更高》相關的同類信息!
  • 本頁收集關于StringBuider 在什么條件下、如何使用效率更高的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品少妇自拍| 最近日韩中文字幕| 久久久国产精品麻豆| 欧美电影影音先锋| 91.麻豆视频| 国产精品欧美综合在线| 天天影视网天天综合色在线播放| 亚洲h精品动漫在线观看| 黄色日韩三级电影| 色狠狠色噜噜噜综合网| 日韩欧美一区二区在线视频| 中文字幕乱码一区二区免费| 一区二区三区**美女毛片| 免费三级欧美电影| av男人天堂一区| 亚洲综合精品自拍| 国产精品一区二区男女羞羞无遮挡| 99精品桃花视频在线观看| 欧美一卡二卡三卡| 亚洲激情男女视频| 成人一级片在线观看| 94-欧美-setu| 国产精品国产自产拍高清av| 国产一区二区女| 日韩视频中午一区| 亚洲国产另类av| 91免费观看视频| 国产精品人妖ts系列视频| 婷婷成人综合网| 欧美性淫爽ww久久久久无| 欧美激情一区三区| 国产在线不卡视频| 日韩视频免费观看高清完整版在线观看| 国产精品美女久久久久久久久| 久久精品国产77777蜜臀| 777亚洲妇女| 亚洲成人免费视频| 欧美视频在线观看一区二区| 久久亚洲影视婷婷| 亚洲国产欧美一区二区三区丁香婷| 成人精品gif动图一区| 久久精品水蜜桃av综合天堂| 久久精品国产秦先生| 欧美美女黄视频| 图片区小说区国产精品视频| 欧美中文字幕不卡| 亚洲第一在线综合网站| 在线观看视频一区| 亚洲码国产岛国毛片在线| 成人黄色一级视频| 亚洲色图制服诱惑| 欧美中文字幕一二三区视频| 亚洲一区在线观看网站| 欧美自拍偷拍一区| 亚洲成人精品影院| 91麻豆精品国产自产在线观看一区| 天堂久久一区二区三区| 911国产精品| 国精产品一区一区三区mba视频| 欧美午夜一区二区| 亚洲激情六月丁香| 9191精品国产综合久久久久久| 日本在线不卡视频一二三区| 欧美成人精精品一区二区频| 激情国产一区二区| 国产精品看片你懂得| 91天堂素人约啪| 日韩精品高清不卡| 2020国产精品| av电影一区二区| 一区在线中文字幕| 欧美精品自拍偷拍动漫精品| 麻豆视频一区二区| 中文字幕一区二区三区色视频| 欧美专区日韩专区| 麻豆91精品视频| 国产精品久久久久一区二区三区| 在线观看欧美日本| 精品无码三级在线观看视频| 中文字幕精品—区二区四季| 91免费在线看| 欧美综合欧美视频| 国产原创一区二区| 亚洲乱码国产乱码精品精的特点| 欧美一区二区三区在线视频 | 欧美日韩精品久久久| 日韩专区一卡二卡| 国产精品毛片高清在线完整版| 欧美性色综合网| 豆国产96在线|亚洲| 亚洲图片有声小说| 亚洲国产精品成人综合| 欧美精品视频www在线观看| 国产精品一区二区视频| 最近日韩中文字幕| 欧美嫩在线观看| 95精品视频在线| 国产一区二区在线电影| 亚洲福中文字幕伊人影院| 国产清纯白嫩初高生在线观看91 | 91黄色小视频| 成人一级视频在线观看| 夜夜精品视频一区二区 | 精品一区二区日韩| 亚洲欧美日韩国产一区二区三区| 精品第一国产综合精品aⅴ| 欧美在线三级电影| 99精品视频一区二区三区| 精品一区二区免费在线观看| 婷婷开心久久网| 一区二区三区精品在线| 国产精品乱人伦一区二区| 精品少妇一区二区| 91精品国产综合久久久久久 | www.欧美日韩国产在线| 国产一区亚洲一区| 麻豆中文一区二区| 美女尤物国产一区| 蜜臀久久99精品久久久画质超高清 | 3atv一区二区三区| 欧美亚洲一区二区三区四区| av网站一区二区三区| 成人国产一区二区三区精品| 国产一二精品视频| 国产91清纯白嫩初高中在线观看 | 欧美mv日韩mv| 日韩精品一区二区三区视频| 制服丝袜亚洲网站| 91日韩在线专区| 在线精品视频免费观看| 97se亚洲国产综合在线| 欧美三级午夜理伦三级中视频| 欧美丰满美乳xxx高潮www| 精品少妇一区二区三区日产乱码| 国产日产欧美一区| 亚洲一区中文在线| 欧美精品在线观看播放| 3d成人动漫网站| 欧美激情一区二区三区不卡| 最新中文字幕一区二区三区| 一区二区三区精品在线| 日本不卡视频在线| 国产91色综合久久免费分享| 一本到三区不卡视频| 欧美一级xxx| 亚洲天堂免费在线观看视频| 午夜视频一区在线观看| 国产91露脸合集magnet | 99在线精品视频| 欧美高清激情brazzers| 日本一区二区三区国色天香| 亚洲国产一区二区在线播放| 久草中文综合在线| 在线一区二区三区四区五区 | 26uuu另类欧美亚洲曰本| 国产精品网曝门| 日产欧产美韩系列久久99| 不卡大黄网站免费看| 欧美大片日本大片免费观看| 亚洲女同ⅹxx女同tv| 国产麻豆日韩欧美久久| 欧美偷拍一区二区| 欧美国产视频在线| 精品在线观看免费| 欧美精品少妇一区二区三区| 国产精品国产三级国产aⅴ入口 | 日本一区二区综合亚洲| 蜜桃91丨九色丨蝌蚪91桃色| 欧美在线一区二区三区| 国产精品美女久久久久久| 久久爱另类一区二区小说| 欧美视频你懂的| 亚洲欧美成aⅴ人在线观看| 成人中文字幕合集| 2023国产精品视频| 久久er99精品| 欧美一区二区三区视频在线观看| 伊人开心综合网| 不卡大黄网站免费看| 国产偷v国产偷v亚洲高清| 九九视频精品免费| 欧美日韩国产综合一区二区 | 欧美日韩一区视频| 亚洲精品ww久久久久久p站| aaa亚洲精品| 综合自拍亚洲综合图不卡区| 国产精品18久久久久久久久久久久| 91精品福利在线一区二区三区 | 91精品国产综合久久香蕉麻豆| 亚洲国产日产av| 欧美在线影院一区二区| 亚洲欧美色一区| 色狠狠综合天天综合综合| 亚洲欧美另类在线| 在线观看一区二区视频| 一区二区三区国产| 欧美天堂一区二区三区| 午夜免费久久看| 日韩女同互慰一区二区| 韩国三级电影一区二区|