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