JAVA字符串拼接常見(jiàn)方法匯總
字符串的拼接,常使用到的大概有4種方式:
1.直接使用"+"號(hào)
2.使用String的concat方法
3.使用StringBuilder的append方法
4.使用StringBuffer的append方法
由于String是final類型的,因此String對(duì)象都是屬于不可變對(duì)象,因此,在需要對(duì)字符串進(jìn)行修改操作的時(shí)候(比如字符串的連接或者是替換),String總是會(huì)生成新的對(duì)象。
1.“+”
如果不考慮其他,使用“+”號(hào)來(lái)連接字符串無(wú)疑是最方便、最快捷的方式。但是事實(shí)上,使用“+”號(hào)連接字符串的效率并不高,。
貼出測(cè)試用的demo
public class Str {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "wolrd";
String str = str1 + str2;
System.out.println(str);
}
}
貼出Str通過(guò)編譯之后產(chǎn)生的字節(jié)碼文件
public class com.fzkj.str.Str {
public com.fzkj.str.Str();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String hello
2: astore_1
3: ldc #3 // String wolrd
5: astore_2
6: new #4 // class java/lang/StringBuilder
9: dup
10: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
13: aload_1
14: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
28: aload_3
29: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
32: return
}
通過(guò)上面的字節(jié)碼文件可以看出,在執(zhí)行String str = str1 + str2;這一條語(yǔ)句的時(shí)候,其實(shí)底層是調(diào)用了StringBuilder的append方法來(lái)實(shí)現(xiàn),就是說(shuō)使用“+”號(hào)連接字符串的時(shí)候,底層會(huì)new一個(gè)StringBuilder對(duì)象,調(diào)用該對(duì)象的append方法將字符串拼接起來(lái),最后通過(guò)toString方法返回拼接之后的值。
也就是字符串str1+str2就等效于下面的代碼:
String str1 = "hello"; String str2 = "wolrd"; StringBuilder sb = new StringBuilder(); sb.append(str1).append(str2); String s = sb.toString();
在數(shù)據(jù)量很大的時(shí)候,比如說(shuō)循環(huán)一萬(wàn)次,那就會(huì)創(chuàng)建一萬(wàn)個(gè)StringBuilder對(duì)象。所以說(shuō)使用"+"號(hào)拼接字符串的效率很低。
最后在看一下使用"+"號(hào)拼接str1和str2,100000次的耗時(shí)。
public class Str {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "wolrd";
long startTime = System.currentTimeMillis();
System.out.println("開(kāi)始執(zhí)行時(shí)間:"+ startTime);
for (int i = 0; i < 100000; i++) {
String str = str1 + str2;
}
long stopTime = System.currentTimeMillis();
System.out.println("結(jié)束執(zhí)行時(shí)間:"+ stopTime);
System.out.println("執(zhí)行100000次字符串拼接總共耗時(shí):"+(stopTime - startTime)+"ms");
}
}
開(kāi)始執(zhí)行時(shí)間:1591326544582
結(jié)束執(zhí)行時(shí)間:1591326544601
執(zhí)行100000次字符串拼接總共耗時(shí):19ms
2.concat
concat源碼如下:
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
從concat方法的源碼中可以看出來(lái),concat就是申請(qǐng)了一個(gè)char數(shù)組,將需要拼接的字符串放到這個(gè)數(shù)組中,最后轉(zhuǎn)換為String返回。
還是記錄拼接100000次,總共的耗時(shí)
public class Str {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "wolrd";
// 使用concat連接字符串
String concat = str1.concat(str2);
long startTime = System.currentTimeMillis();
System.out.println("開(kāi)始執(zhí)行時(shí)間:"+ startTime);
for (int i = 0; i < 100000; i++) {
String str = str1.concat(str2);
}
long stopTime = System.currentTimeMillis();
System.out.println("結(jié)束執(zhí)行時(shí)間:"+ stopTime);
System.out.println("執(zhí)行100000次字符串拼接總共耗時(shí):"+(stopTime - startTime)+"ms");
}
}
開(kāi)始執(zhí)行時(shí)間:1591328017552
結(jié)束執(zhí)行時(shí)間:1591328017561
執(zhí)行100000次字符串拼接總共耗時(shí):9ms
3.StringBuffer/StringBuilder
這兩個(gè)類都繼承了同一個(gè)抽象類AbstractStringBuilder;而這兩個(gè)類的append方法都是調(diào)用的父類中的append方法。
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
而它倆的區(qū)別就是StringBuffer的append方法上加了synchronized關(guān)鍵字,因此是線程安全的。
public class Str {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "wolrd";
StringBuffer sb = new StringBuffer();
long startTime = System.currentTimeMillis();
System.out.println("開(kāi)始執(zhí)行時(shí)間:"+ startTime);
for (int i = 0; i < 100000; i++) {
sb.append(str1);
}
long stopTime = System.currentTimeMillis();
System.out.println("結(jié)束執(zhí)行時(shí)間:"+ stopTime);
System.out.println("StringBuffer執(zhí)行100000次字符串拼接總共耗時(shí):"+(stopTime - startTime)+"ms");
StringBuilder sb1 = new StringBuilder();
long startTime1 = System.currentTimeMillis();
System.out.println("開(kāi)始執(zhí)行時(shí)間:"+ startTime1);
for (int i = 0; i < 100000; i++) {
sb1.append(str1);
}
long stopTime1 = System.currentTimeMillis();
System.out.println("結(jié)束執(zhí)行時(shí)間:"+ stopTime1);
System.out.println("StringBuilder執(zhí)行100000次字符串拼接總共耗時(shí):"+(stopTime1 - startTime1)+"ms");
}
}
開(kāi)始執(zhí)行時(shí)間:1591328952926
結(jié)束執(zhí)行時(shí)間:1591328952933
StringBuffer執(zhí)行100000次字符串拼接總共耗時(shí):7ms
開(kāi)始執(zhí)行時(shí)間:1591328952934
結(jié)束執(zhí)行時(shí)間:1591328952936
StringBuilder執(zhí)行100000次字符串拼接總共耗時(shí):2ms
StringBuilder的性能比StringBuffer的性能要好點(diǎn)。
從上面的結(jié)果中,可以得出一個(gè)結(jié)論,那就是這四種的效率由快到慢依次是:
StringBudiler>StringBuffer>concat>+
事實(shí)上,在拼接的字符串很少的情況下,concat的效率其實(shí)是比StringBuilder的效率還要高的。
所以在實(shí)際的使用過(guò)程中,要根據(jù)自己的需求選擇使用。。
以上就是JAVA字符串拼接常見(jiàn)方法匯總的詳細(xì)內(nèi)容,更多關(guān)于JAVA字符串拼接的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JAVA生成八位不重復(fù)隨機(jī)數(shù)最快的方法總結(jié)(省時(shí)間省空間)
隨機(jī)數(shù)在實(shí)際中使用很廣泛,比如要隨即生成一個(gè)固定長(zhǎng)度的字符串、數(shù)字,這篇文章主要給大家介紹了關(guān)于JAVA生成八位不重復(fù)隨機(jī)數(shù)最快的方法,文中介紹的方法省時(shí)間省空間,需要的朋友可以參考下2024-03-03
SpringBoot之logback-spring.xml不生效的解決方法
這篇文章主要介紹了SpringBoot之logback-spring.xml不生效的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Java thread.isInterrupted() 返回值不確定結(jié)果分析解決
這篇文章主要介紹了Java thread.isInterrupted() 返回值不確定結(jié)果分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12
SpringBoot事務(wù)異步調(diào)用引發(fā)的bug解決
本文主要介紹了SpringBoot事務(wù)異步調(diào)用引發(fā)的bug解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
SpringBoot應(yīng)用啟動(dòng)過(guò)程分析
這篇文章主要介紹了SpringBoot應(yīng)用啟動(dòng)過(guò)程分析,需要的朋友可以參考下2017-08-08
Mybatis返回map集合時(shí),列的順序與select不一致問(wèn)題
這篇文章主要介紹了Mybatis返回map集合時(shí),列的順序與select不一致問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
IDEA SSM整合Redis項(xiàng)目實(shí)例 附源碼
今天給大家普及IDEA SSM整合Redis項(xiàng)目實(shí)例,包括pom.xml 配置和spring-redis.xml 配置代碼,代碼也很簡(jiǎn)單,通過(guò)項(xiàng)目實(shí)際案例能更好的幫助大家理解,需要的朋友可以參考下2021-06-06
Java+Selenium調(diào)用JavaScript的方法詳解
這篇文章主要為大家講解了java在利用Selenium操作瀏覽器網(wǎng)站時(shí)候,有時(shí)會(huì)需要用的JavaScript的地方,代碼該如何實(shí)現(xiàn)呢?快跟隨小編一起學(xué)習(xí)一下吧2023-01-01

