国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

提升性能:使用String還是StringBuffer?

2019-11-18 11:54:56
字體:
供稿:網(wǎng)友

    出于方便的考慮,我們在進(jìn)行字符串的內(nèi)容處理的時候往往會出現(xiàn)以下的代碼:String result="";result+="ok";

    這段代碼看上去似乎沒有什么問題,但是需要指出的是其性能很低,原因是java中的String類不可變的(immutable),這段代碼實(shí)際的工作過程會是如何的呢?通過使用javap工具我們可以知道其實(shí)上面的代碼在編譯成字節(jié)碼的時候等同的源代碼是:String result="";StringBuffer temp=new StringBuffer();temp.append(result);temp.append("ok");result=temp.toString();

    短短的兩個語句怎么呢變成這么多呢?問題的原因就在String類的不可變性上,而java程序?yàn)榱朔奖愫唵蔚淖址褂梅绞綄?操作符進(jìn)行了重載,而這個重載的處理可能因此誤導(dǎo)很多對java中String的使用。

    下面給出一個完整的代碼:

    public class Perf { public static String detab1(String s)

    { if (s.indexOf('/t') == -1)

    return s;String res = "";int len = s.length();int pos = 0;int i = 0;for (; i < len && s.charAt(i) == '/t'; i++)

    { res += "        ";pos += 8;} for (; i < len; i++)

    { char c = s.charAt(i);if (c == '/t') { do { res += " ";pos++;} while (pos % 8 != 0);} else { res += c;pos++;} return res;}

    public static String detab2(String s)

    { if (s.indexOf('/t') == -1)

    return s;StringBuffer sb = new StringBuffer();int len = s.length();int pos = 0;int i = 0;for (; i < len && s.charAt(i) == '/t'; i++)

    { sb.append("        ");pos += 8;} for (; i < len; i++) { char c = s.charAt(i);if (c == '/t') { do { sb.append(' ');pos++;} while (pos % 8 != 0);} else { sb.append(c);pos++;} return sb.toString();}

    public static String testlist[] = { "","/t","/t/t/tabc","abc/tdef","1234567/t8","12345678/t9","123456789/t" };

    public static void main(String args[])

    { for (int i = 0; i < testlist.length; i++) { String tc = testlist[i];if (!detab1(tc)。equals(detab2(tc)))

    System.err.PRintln(tc);}

    String test_string = "/t/tthis is a test/tof detabbing performance";int N = 5000;int i = 0;

    long ct = System.currentTimeMillis();for (i = 1; i <= N; i++)

    detab1(test_string);long elapsed = System.currentTimeMillis() - ct;System.out.println("String time = " + elapsed);

    ct = System.currentTimeMillis();for (i = 1; i <= N; i++)

    detab2(test_string);elapsed = System.currentTimeMillis() - ct;System.out.println("StringBuffer time = " + elapsed);}

    執(zhí)行以上代碼的結(jié)果可以看到使用StringBuffer的版本的方法比使用String版本的一般都快十倍以上(本人使用的是JDK1.4.0),你可以執(zhí)行一下看看結(jié)果到底如何。

    因此得到的結(jié)論是:假如你對字符串中的內(nèi)容經(jīng)常進(jìn)行操作,非凡是內(nèi)容要修改時,那么使用StringBuffer,假如最后需要String,那么使用StringBuffer的toString()方法好了!也許這就是你的程序的性能瓶頸!



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 余姚市| 双辽市| 泸西县| 遂溪县| 佛坪县| 蓝山县| 神农架林区| 于田县| 象山县| 南郑县| 恩平市| 仁布县| 秦安县| 特克斯县| 黑龙江省| 平果县| 神农架林区| 开封县| 佳木斯市| 南充市| 冷水江市| 满洲里市| 玉屏| 陵川县| 葵青区| 海淀区| 东乌珠穆沁旗| 高邮市| 孝昌县| 得荣县| 青海省| 曲麻莱县| 张家口市| 河津市| 新丰县| 桃园市| 伊宁县| 蒙自县| 定兴县| 伊吾县| 伊宁县|