最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談StringBuilder類的capacity()方法和length()方法的一些小坑

 更新時(shí)間:2021年07月14日 11:27:08   作者:流年逝水染輕塵  
這篇文章主要介紹了StringBuilder類的capacity()方法和length()方法的一些小坑,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

今天在做項(xiàng)目的過程中遇見一個(gè)StringBuilder.delete()刪除得不到自己期望結(jié)果問題,一個(gè)截取字符串的問題,總得不到自己所期望的答案:

問題如下:

stringBuilder.delete(stringBuilder.capacity() - 5, stringBuilder.capacity());

此句代碼要么報(bào)錯(cuò),要么多刪,要么少刪,也有時(shí)候正確。也有時(shí)候得不到自己所想要的字符串;

簡單的測試capacity()方法和length()方法的區(qū)別如下:

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefgh2321");
System.out.println("length:" + stringBuilder.length());
System.out.println("capacity:" + stringBuilder.capacity());
System.out.println("length截?。? + stringBuilder.delete(stringBuilder.length() - 3,stringBuilder.length()));
System.out.println("capacity截取:" + stringBuilder.delete(stringBuilder.capacity() - 7,stringBuilder.capacity()));
System.out.println("capacity截?。? + stringBuilder.delete(stringBuilder.capacity() - 5,stringBuilder.capacity()));

代碼如上:

輸出:

最后查看源碼,

StringBuilder類繼承于AbstractStringBuilder抽象類:

在AbstractStringBuilder抽象類中,放入進(jìn)去的字符串存儲(chǔ)于char[] value 數(shù)組中,count為存進(jìn)去的字符數(shù)目,

使用capacity()方法得到的為 value數(shù)組的長度,length()方法得到的為count,也就是字符串的實(shí)際長度。

在初始化StringBuilder時(shí)候,也就是new StringBuilder()時(shí)候,會(huì)初始化一個(gè)char[16]大小的char數(shù)據(jù)來存儲(chǔ)字符串,如果字符串增加之后,會(huì)進(jìn)行擴(kuò)容。

當(dāng)然,如果 new StringBuilder("213123");會(huì)在字符串的長度的增加16作為初始數(shù)組char[] value的大小,

最后:

希望大家在使用capacity()方法和length()方法時(shí)要注意選擇:否則會(huì)導(dǎo)致意想不到的坑。

StringBuilder初始化的大小對性能的影響

StringBuilder 是一個(gè)可以動(dòng)態(tài)增加自身數(shù)據(jù)長度的類,其默認(rèn)長度(capacity屬性)為16。

它有一個(gè)構(gòu)造函數(shù),可以指定其容器長度。當(dāng)數(shù)據(jù)量小時(shí),指定長度意義不大,但是當(dāng)數(shù)據(jù)量比較大時(shí),指定長度會(huì)對性能產(chǎn)生顯著影響。

本文通過一個(gè)小示例驗(yàn)證其對性能產(chǎn)生的影響

代碼如下:

public class StringBuilderTest {
 public static void main(String[] args) throws Exception {
  // 前兩行分別是獲取運(yùn)行次數(shù)和StringBuilder的初始化長度
  int times = args.length > 0 ? Integer.parseInt(args[0]) : 100;
  int length = args.length > 1 ? Integer.parseInt(args[1]) : 0;
  
  // 運(yùn)行 times 次的 test(length)方法
  long t1 = System.currentTimeMillis();
  for (int i = 0; i < times; i++)
   test(length);
  long t2 = System.currentTimeMillis();
  
  // 輸出單次運(yùn)行時(shí)間 
  System.out.printf("Time taken: %d ms.\n", (t2 - t1) / times);
 }

 // 這個(gè)方法只是單純地做循環(huán)向StringBuilder中添加數(shù)據(jù)。
 static int test(int length) {
  StringBuilder sb = new StringBuilder(length);
  for (int i = 0; i < 10000000; i++)
   sb.append(i + "");
  return sb.length();
 }
}

以下是編碼后,分配2GB內(nèi)存,在控制臺(tái)測試運(yùn)行100次的運(yùn)行結(jié)果。

$ java -Xmx2g -Xms2g StringBuilderTest 100 0

Time taken: 273 ms.

$ java -Xmx2g -Xms2g StringBuilderTest 100 73000000

Time taken: 205 ms.

性能差距約為30%

結(jié)論

當(dāng)在使用StringBuilder處理大數(shù)據(jù)的時(shí)候,如果我們可以預(yù)知或者以很小的性能損失就能獲得數(shù)據(jù)的大小時(shí),提前指定StringBuilder的長度可顯著提高處理速度。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

泗水县| 阳西县| 台中市| 新龙县| 新巴尔虎左旗| 新蔡县| 治县。| 重庆市| 德昌县| 神池县| 临泽县| 盐池县| 隆尧县| 福清市| 天柱县| 永春县| 雅安市| 新绛县| 瑞金市| 德化县| 兰溪市| 灵寿县| 博湖县| 大兴区| 蒲城县| 肃宁县| 循化| 新巴尔虎左旗| 沙河市| 芦山县| 左权县| 利川市| 松桃| 芦溪县| 白水县| 卓资县| 昭觉县| 景东| 晋城| 海兴县| 安国市|