溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JAVA不同類型的字符串怎么拼接?

發(fā)布時(shí)間:2020-06-23 17:48:33 來源:億速云 閱讀:321 作者:清晨 欄目:編程語言

不懂JAVA不同類型的字符串怎么拼接??其實(shí)想解決這個(gè)問題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。

字符串的拼接,常使用到的大概有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)來連接字符串無疑是最方便、最快捷的方式。但是事實(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通過編譯之后產(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
}

通過上面的字節(jié)碼文件可以看出,在執(zhí)行String str = str1 + str2;這一條語句的時(shí)候,其實(shí)底層是調(diào)用了StringBuilder的append方法來實(shí)現(xiàn),就是說使用“+”號(hào)連接字符串的時(shí)候,底層會(huì)new一個(gè)StringBuilder對(duì)象,調(diào)用該對(duì)象的append方法將字符串拼接起來,最后通過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í)候,比如說循環(huán)一萬次,那就會(huì)創(chuàng)建一萬個(gè)StringBuilder對(duì)象。所以說使用"+"號(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("開始執(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");

  }
}

開始執(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方法的源碼中可以看出來,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("開始執(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");

  }
}

開始執(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("開始執(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("開始執(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");
  }
}

開始執(zhí)行時(shí)間:1591328952926
結(jié)束執(zhí)行時(shí)間:1591328952933
StringBuffer執(zhí)行100000次字符串拼接總共耗時(shí):7ms
開始執(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í)際的使用過程中,要根據(jù)自己的需求選擇使用。。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享JAVA不同類型的字符串怎么拼接??jī)?nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細(xì)的解決方法等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI