欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA字符串拼接常見方法匯總

 更新時間:2020年06月11日 11:23:56   作者:''買條秋褲穿  
這篇文章主要介紹了JAVA字符串拼接常見方法,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

字符串的拼接,常使用到的大概有4種方式:

1.直接使用"+"號

2.使用String的concat方法

3.使用StringBuilder的append方法

4.使用StringBuffer的append方法

由于String是final類型的,因此String對象都是屬于不可變對象,因此,在需要對字符串進行修改操作的時候(比如字符串的連接或者是替換),String總是會生成新的對象。

1.“+”

如果不考慮其他,使用“+”號來連接字符串無疑是最方便、最快捷的方式。但是事實上,使用“+”號連接字符串的效率并不高,。

貼出測試用的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;這一條語句的時候,其實底層是調(diào)用了StringBuilder的append方法來實現(xiàn),就是說使用“+”號連接字符串的時候,底層會new一個StringBuilder對象,調(diào)用該對象的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ù)量很大的時候,比如說循環(huán)一萬次,那就會創(chuàng)建一萬個StringBuilder對象。所以說使用"+"號拼接字符串的效率很低。

最后在看一下使用"+"號拼接str1和str2,100000次的耗時。

public class Str {

  public static void main(String[] args) {
    String str1 = "hello";
    String str2 = "wolrd";

    long startTime = System.currentTimeMillis();
    System.out.println("開始執(zhí)行時間:"+ startTime);
    for (int i = 0; i < 100000; i++) {
      String str = str1 + str2;
    }
    long stopTime = System.currentTimeMillis();
    System.out.println("結(jié)束執(zhí)行時間:"+ stopTime);
    System.out.println("執(zhí)行100000次字符串拼接總共耗時:"+(stopTime - startTime)+"ms");

  }
}

開始執(zhí)行時間:1591326544582
結(jié)束執(zhí)行時間:1591326544601
執(zhí)行100000次字符串拼接總共耗時: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就是申請了一個char數(shù)組,將需要拼接的字符串放到這個數(shù)組中,最后轉(zhuǎn)換為String返回。

還是記錄拼接100000次,總共的耗時

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í)行時間:"+ startTime);
    for (int i = 0; i < 100000; i++) {
      String str = str1.concat(str2);
    }
    long stopTime = System.currentTimeMillis();
    System.out.println("結(jié)束執(zhí)行時間:"+ stopTime);
    System.out.println("執(zhí)行100000次字符串拼接總共耗時:"+(stopTime - startTime)+"ms");

  }
}

開始執(zhí)行時間:1591328017552
結(jié)束執(zhí)行時間:1591328017561
執(zhí)行100000次字符串拼接總共耗時:9ms

3.StringBuffer/StringBuilder

這兩個類都繼承了同一個抽象類AbstractStringBuilder;而這兩個類的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í)行時間:"+ startTime);
    for (int i = 0; i < 100000; i++) {
      sb.append(str1);
    }
    long stopTime = System.currentTimeMillis();
    System.out.println("結(jié)束執(zhí)行時間:"+ stopTime);
    System.out.println("StringBuffer執(zhí)行100000次字符串拼接總共耗時:"+(stopTime - startTime)+"ms");

    StringBuilder sb1 = new StringBuilder();
    long startTime1 = System.currentTimeMillis();
    System.out.println("開始執(zhí)行時間:"+ startTime1);
    for (int i = 0; i < 100000; i++) {
      sb1.append(str1);
    }
    long stopTime1 = System.currentTimeMillis();
    System.out.println("結(jié)束執(zhí)行時間:"+ stopTime1);
    System.out.println("StringBuilder執(zhí)行100000次字符串拼接總共耗時:"+(stopTime1 - startTime1)+"ms");
  }
}

開始執(zhí)行時間:1591328952926
結(jié)束執(zhí)行時間:1591328952933
StringBuffer執(zhí)行100000次字符串拼接總共耗時:7ms
開始執(zhí)行時間:1591328952934
結(jié)束執(zhí)行時間:1591328952936
StringBuilder執(zhí)行100000次字符串拼接總共耗時:2ms

StringBuilder的性能比StringBuffer的性能要好點。
從上面的結(jié)果中,可以得出一個結(jié)論,那就是這四種的效率由快到慢依次是:
StringBudiler>StringBuffer>concat>+

事實上,在拼接的字符串很少的情況下,concat的效率其實是比StringBuilder的效率還要高的。
所以在實際的使用過程中,要根據(jù)自己的需求選擇使用。。

以上就是JAVA字符串拼接常見方法匯總的詳細內(nèi)容,更多關(guān)于JAVA字符串拼接的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中的IO流原理和流的分類詳解

    Java中的IO流原理和流的分類詳解

    這篇文章主要介紹了Java中的IO流原理和流的分類詳解,Java?io流是Java編程語言中用于輸入和輸出操作的一種機制。它提供了一組類和接口,用于處理不同類型的數(shù)據(jù)流,包括文件、網(wǎng)絡(luò)連接、內(nèi)存等,需要的朋友可以參考下
    2023-10-10
  • Java獲取時間年、月、日的方法

    Java獲取時間年、月、日的方法

    這篇文章主要介紹了Java獲取時間年、月、日的方法,涉及java時間操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 阿里的一道Java并發(fā)面試題詳解

    阿里的一道Java并發(fā)面試題詳解

    這篇文章主要介紹了阿里的一道Java并發(fā)面試題詳解,網(wǎng)絡(luò)、并發(fā)相關(guān)的知識,相對其他一些編程知識點更難一些,主要是不好調(diào)試并且涉及內(nèi)容太多 !,需要的朋友可以參考下
    2019-06-06
  • Java中常用的五種List聲明并賦值操作方式

    Java中常用的五種List聲明并賦值操作方式

    在Java編程中經(jīng)常會使用到集合類來存儲和操作多個元素,List是一種常見的集合類,它允許存儲重復(fù)的元素,并且保持元素的插入順序,這篇文章主要給大家介紹了關(guān)于Java中常用的五種List聲明并賦值操作的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • JAVA中的日期時間類用法總結(jié)

    JAVA中的日期時間類用法總結(jié)

    這篇文章主要給大家介紹了關(guān)于JAVA中日期時間類用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringCloud微服務(wù)集成Dubbo的詳細過程

    SpringCloud微服務(wù)集成Dubbo的詳細過程

    Apache?Dubbo?是一款易用、高性能的?WEB?和?RPC?框架,同時為構(gòu)建企業(yè)級微服務(wù)提供服務(wù)發(fā)現(xiàn)、流量治理、可觀測、認證鑒權(quán)等能力、工具與最佳實踐,這篇文章主要介紹了SpringCloud微服務(wù)集成Dubbo,需要的朋友可以參考下
    2024-03-03
  • Mybatis中的PageHelper的執(zhí)行流程分析

    Mybatis中的PageHelper的執(zhí)行流程分析

    這篇文章主要介紹了Mybatis的PageHelper執(zhí)行流程,本文給大家介紹介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • jsoup?框架的使用小結(jié)

    jsoup?框架的使用小結(jié)

    jsoup 是一款基于Java的HTML解析器,它提供了一套非常省力的API,不但能直接解析某個URL地址、HTML文本內(nèi)容,而且還能通過類似于 DOM、CSS 或者jQuery的方法來操作數(shù)據(jù),所以jsoup也可以被當做爬蟲工具使用,這篇文章主要介紹了jsoup使用,需要的朋友可以參考下
    2023-04-04
  • 詳解Spring中Spel表達式和el表達式的區(qū)別

    詳解Spring中Spel表達式和el表達式的區(qū)別

    在?Java?開發(fā)中,表達式語言是一種強大的工具,而SpEL?表達式與EL?表達式是我們常常遇到兩種表達式語言,下面我們就來看看它們的具體使用與區(qū)別吧
    2023-07-07
  • java實現(xiàn)簡單石頭剪刀布游戲

    java實現(xiàn)簡單石頭剪刀布游戲

    這篇文章主要介紹了java實現(xiàn)簡單石頭剪刀布游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02

最新評論