基于String不可變字符與StringBuilder可變字符的效率問題
String與StringBuilder的效率
1.如果需知要拼接的內(nèi)容比較道少
不可變,拼接的多會(huì)產(chǎn)生多個(gè)新的對(duì)象,十分的耗費(fèi)內(nèi)存空間和程序執(zhí)行效率
String result = "abc" + String.valueOf(1); String result = "abc" + 1;
2.如果需內(nèi)要拼接的內(nèi)容比較容多
可以使用可變對(duì)象StringBuilder或者StringBuffer
String result = new StringBuffer().append("abc").append(1).append("def").append(2).toString();
package 可變與不可變的陷阱以及測(cè)試效率; public class TimeTest { public static void main(String[] args) { StringTime(); StringBuilderTime(); } public static void StringTime() { long num1 = Runtime.getRuntime().freeMemory(); // 獲取系統(tǒng)內(nèi)存剩余空間 long time1 = System.currentTimeMillis();// 獲取系統(tǒng)當(dāng)前時(shí)間 String str = ""; for (int i = 0; i < 1000; i++) { str = str + i; } // System.out.println(str);// long num2 = Runtime.getRuntime().freeMemory(); // 獲取系統(tǒng)內(nèi)存剩余空間 long time2 = System.currentTimeMillis();// 獲取系統(tǒng)當(dāng)前時(shí)間 System.out.println("String所用內(nèi)存空間" + (num1 - num2));// 所用內(nèi)存空間 System.out.println("String所用時(shí)間" + (time2 - time1));// 所用時(shí)間 } public static void StringBuilderTime() { long num1 = Runtime.getRuntime().freeMemory(); // 獲取系統(tǒng)內(nèi)存剩余空間 long time1 = System.currentTimeMillis();// 獲取系統(tǒng)當(dāng)前時(shí)間 StringBuilder str = new StringBuilder(""); for (int i = 0; i < 1000; i++) { str.append(i); } // System.out.println(str); long num2 = Runtime.getRuntime().freeMemory(); // 獲取系統(tǒng)內(nèi)存剩余空間 long time2 = System.currentTimeMillis();// 獲取系統(tǒng)當(dāng)前時(shí)間 System.out.println("StringBuilder所用內(nèi)存空間" + (num1 - num2));// 所用內(nèi)存空間 System.out.println("StringBuilder所用時(shí)間" + (time2 - time1));// 所用時(shí)間 } }
總結(jié):
用String拼接字符串會(huì)產(chǎn)生大量對(duì)象耗費(fèi)內(nèi)存以及執(zhí)行效率,所以在開發(fā)中建議使用StringBuilder進(jìn)行字符串拼接
測(cè)試StringBuffer與StringBuilder的效率
相同點(diǎn):
都是長(zhǎng)度可變的字符串,兩者基本操作相同
兩者主要區(qū)別在于:
1.StringBuffer是線程安全的,StringBuilder是線程不安全的
2.StringBuffer從jdk1.0就存在,StringBuilder是在jdk5.0后才出現(xiàn)
StringBuilder相較與StringBuffer有速度優(yōu)勢(shì),所以多數(shù)情況下建議使用StringBuilder
然而應(yīng)用程序要求線程安全的情況下,則必須使用StringBuffer類
代碼演示
//StringBuilder線程不安全 public class StringBuilderDemo { public static void main(String[] args) { long beginTime = System.currentTimeMillis();//開始計(jì)時(shí) StringBuilder builder = new StringBuilder(); for(int i=0;i<80000000;i++) { builder.append(i); } long endtime = System.currentTimeMillis();//結(jié)束計(jì)時(shí) System.out.println("StringBuilder所用時(shí)間:"+(endtime-beginTime)); } }
結(jié)果:
//StringBuffer線程安全 public class StringBufferDemo { public static void main(String[] args) { long beginTime1 = System.currentTimeMillis();//開始計(jì)時(shí) StringBuffer buffer = new StringBuffer(); for(int i=0;i<80000000;i++) { buffer.append(i); } long endtime1 = System.currentTimeMillis();//結(jié)束計(jì)時(shí) System.out.println("StringBuffer所用時(shí)間:"+(endtime1-beginTime1)); } }
結(jié)果:
由此可見,StringBuilder確實(shí)是會(huì)比StringBuffer速度更快一些。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)置PDF跨頁(yè)表格重復(fù)顯示表頭行的步驟詳解
這篇文章主要給大家介紹了關(guān)于Java設(shè)置PDF跨頁(yè)表格重復(fù)顯示表頭行的相關(guān)資料,這里使用的是Free Spire.PDF for Java的jar包,Spire.PDF for Java 是一款專門對(duì) PDF 文檔進(jìn)行操作的 Java 類庫(kù),需要的朋友可以參考下2021-07-07將本地JAR文件手動(dòng)添加到Maven本地倉(cāng)庫(kù)的實(shí)現(xiàn)過程
在Java開發(fā)中,使用Maven作為項(xiàng)目管理工具已經(jīng)成為了主流的選擇,Maven提供了強(qiáng)大的依賴管理功能,可以輕松地下載和管理項(xiàng)目所需的庫(kù)和工具,在某些情況下,你可能會(huì)需要將本地下載的JAR文件手動(dòng)添加到Maven的本地倉(cāng)庫(kù)中,這篇博客將詳細(xì)介紹如何實(shí)現(xiàn)這一過程2024-10-10SpringBoot應(yīng)用部署于外置Tomcat容器的方法
這篇文章主要介紹了SpringBoot應(yīng)用部署于外置Tomcat容器的方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06Java實(shí)現(xiàn)簡(jiǎn)單局域網(wǎng)聊天室
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單局域網(wǎng)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06mybatis中如何實(shí)現(xiàn)一個(gè)標(biāo)簽執(zhí)行多個(gè)sql語(yǔ)句
這篇文章主要介紹了mybatis中如何實(shí)現(xiàn)一個(gè)標(biāo)簽執(zhí)行多個(gè)sql語(yǔ)句問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04SpringBoot中如何統(tǒng)一接口返回與全局異常處理詳解
全局異常處理是個(gè)比較重要的功能,一般在項(xiàng)目里都會(huì)用到,這篇文章主要給大家介紹了關(guān)于SpringBoot中如何統(tǒng)一接口返回與全局異常處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09