情景展示
在實際開發過程中,我們通常使用StringBuilder或StringBuffer來完成字符串的拼接工作,有時需要進行數據清空操作。
清空StringBuilder或StringBuffer有哪些方式能夠實現?哪種方式最快?
StringBuilder sb = new StringBuilder(); sb.append("君不見黃河之水天上來");
方式一:調用setLength()
sb.setLength(0);
方式二:調用delete() 推薦使用
sb.delete(0,sb.length());
方式三:創建新對象
創建新對象,舊對象由java垃圾回收機制自動處理
sb = new StringBuilder();
速度對比
測試1:
// 循環次數:一千萬次 final int loopTimes = 10000000; StringBuilder sb = new StringBuilder(); long begin = System.currentTimeMillis(); // 第3種方式 for (int i = 0; i < loopTimes; i++) { // 清空 sb = new StringBuilder(); // append的字符串要都不相同,杜絕java字符串常量池的影響 sb.append(UniqueUtils.generateGuid());// 唯一值 } System.out.println("new對象所耗時間:" + (System.currentTimeMillis() - begin)); begin = System.currentTimeMillis(); // 第2種方式 for (int i = 0; i < loopTimes; i++) { // 清空 sb.delete(0, sb.length()); sb.append(UniqueUtils.generateGuid());// 唯一值 } System.out.println("delete所耗時間:" + (System.currentTimeMillis() - begin)); begin = System.currentTimeMillis(); // 第1種方式 for (int i = 0; i < loopTimes; i++) { // 清空 sb.setLength(0); sb.append(UniqueUtils.generateGuid());// 唯一值 } System.out.println("setLength所耗時間:" + (System.currentTimeMillis() - begin));
測試2:
為了進一步驗證delete和setLength哪個更快,我二者的執行先后順序進行了調換
// 循環次數:一千萬次 final int loopTimes = 10000000; StringBuilder sb = new StringBuilder(); log.debug("方式三開始運行。。。"); long begin = System.currentTimeMillis(); // 第3種方式 for (int i = 0; i < loopTimes; i++) { // 清空 sb = new StringBuilder(); // append的字符串要都不相同,杜絕java字符串常量池的影響 sb.append(UniqueUtils.generateGuid());// 唯一值 } System.out.println("new對象所耗時間:" + (System.currentTimeMillis() - begin)); log.debug("方式一開始運行。。。"); begin = System.currentTimeMillis(); // 第1種方式 for (int i = 0; i < loopTimes; i++) { // 清空 sb.setLength(0); sb.append(UniqueUtils.generateGuid());// 唯一值 } System.out.println("setLength所耗時間:" + (System.currentTimeMillis() - begin)); log.debug("方式二開始運行。。。"); begin = System.currentTimeMillis(); // 第2種方式 for (int i = 0; i < loopTimes; i++) { // 清空 sb.delete(0, sb.length()); sb.append(UniqueUtils.generateGuid());// 唯一值 } System.out.println("delete所耗時間:" + (System.currentTimeMillis() - begin));
實驗結果證明:
delete也就是方式二的執行速度更快。
StringBuffer與StringBuilder清空的方法一致,也是delete的效率更高