基于String不可變字符與StringBuilder可變字符的效率問題
String與StringBuilder的效率
1.如果需知要拼接的內(nèi)容比較道少
不可變,拼接的多會產(chǎn)生多個新的對象,十分的耗費(fèi)內(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)生大量對象耗費(fèi)內(nèi)存以及執(zhí)行效率,所以在開發(fā)中建議使用StringBuilder進(jìn)行字符串拼接
測試StringBuffer與StringBuilder的效率
相同點(diǎn):
都是長度可變的字符串,兩者基本操作相同
兩者主要區(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();//開始計(jì)時
StringBuilder builder = new StringBuilder();
for(int i=0;i<80000000;i++) {
builder.append(i);
}
long endtime = System.currentTimeMillis();//結(jié)束計(jì)時
System.out.println("StringBuilder所用時間:"+(endtime-beginTime));
}
}
結(jié)果:

//StringBuffer線程安全
public class StringBufferDemo {
public static void main(String[] args) {
long beginTime1 = System.currentTimeMillis();//開始計(jì)時
StringBuffer buffer = new StringBuffer();
for(int i=0;i<80000000;i++) {
buffer.append(i);
}
long endtime1 = System.currentTimeMillis();//結(jié)束計(jì)時
System.out.println("StringBuffer所用時間:"+(endtime1-beginTime1));
}
}
結(jié)果:

由此可見,StringBuilder確實(shí)是會比StringBuffer速度更快一些。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(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 文檔進(jìn)行操作的 Java 類庫,需要的朋友可以參考下2021-07-07
將本地JAR文件手動添加到Maven本地倉庫的實(shí)現(xiàn)過程
在Java開發(fā)中,使用Maven作為項(xiàng)目管理工具已經(jīng)成為了主流的選擇,Maven提供了強(qiáng)大的依賴管理功能,可以輕松地下載和管理項(xiàng)目所需的庫和工具,在某些情況下,你可能會需要將本地下載的JAR文件手動添加到Maven的本地倉庫中,這篇博客將詳細(xì)介紹如何實(shí)現(xiàn)這一過程2024-10-10
SpringBoot應(yīng)用部署于外置Tomcat容器的方法
這篇文章主要介紹了SpringBoot應(yīng)用部署于外置Tomcat容器的方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06
Java實(shí)現(xiàn)簡單局域網(wǎng)聊天室
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單局域網(wǎng)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06
mybatis中如何實(shí)現(xiàn)一個標(biāo)簽執(zhí)行多個sql語句
這篇文章主要介紹了mybatis中如何實(shí)現(xiàn)一個標(biāo)簽執(zhí)行多個sql語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
SpringBoot中如何統(tǒng)一接口返回與全局異常處理詳解
全局異常處理是個比較重要的功能,一般在項(xiàng)目里都會用到,這篇文章主要給大家介紹了關(guān)于SpringBoot中如何統(tǒng)一接口返回與全局異常處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09

