首頁 Java java教程 Java8中不再需要StringBuilder拼接字串的詳情介紹

Java8中不再需要StringBuilder拼接字串的詳情介紹

Mar 18, 2017 am 11:20 AM

在Java開發者中,字串的拼接佔用資源高往往是熱議的話題.

讓我們深入討論為什麼會佔用高資源。

在Java中,字串物件是不可變的,意思是它一旦創建,你就無法再改變它。所以在我們拼接字串的時候,創建了一個新的字串,舊的被垃圾回收器標記。

如果我們處理百萬的字串,然後,我們就會產生百萬的額外字串被垃圾回收器處理。

虛擬機器底層在拼接字串時執行了眾多操作。拼接字串最直接的點操作(dot operator)就是String#concat(String)運算。

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);
}
登入後複製
public static char[] copyOf(char[] original, int newLength) {
    char[] copy = new char[newLength];
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}
登入後複製
void getChars(char dst[], int dstBegin) {
    System.arraycopy(value, 0, dst, dstBegin, value.length);
}
登入後複製

你可以看到一個字元陣列被創建,長度則是已有字元和拼接的字元長度總和。然後,它們的值複製到新的字元數組中。最後,用這個字元數組建立一個String物件並返回。

所以這些操作多,如果你計算一下,會發現是O(n^2)的複雜度。

為了解決這個問題,我們使用StringBuilder類別。它就像可變的String類別。拼接方法幫助我們避免不必要的複製。它擁有O(n)的複雜度,遠遠優於O(n^2)。

然而Java 8預設使用StringBuilder拼接字串。

Java 8的文件說明:

為了提高字字串拼接的效能,Java編譯器可以使用StringBuffer類別或類似技術,在使用求值表達式時,減少中間String物件的建立。

Java編譯器處理這種情況:

public class StringConcatenateDemo {
  public static void main(String[] args) {
     String str = "Hello ";
     str += "world";
   }
}
登入後複製

上面的程式碼會被編譯成如下字節碼:

public class StringConcatenateDemo {
  public StringConcatenateDemo();
    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: new           #3                  // class java/lang/StringBuilder
       6: dup
       7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      10: aload_1
      11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      14: ldc           #6                  // String world
      16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      22: astore_1
      23: return
}
登入後複製

你可以在這些字節碼中看到,使用了StringBuilder。所以我們在Java 8中不再需要使用StringBuilder類別。

以上是Java8中不再需要StringBuilder拼接字串的詳情介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 8中如何計算一年前或一年後的日期? Java 8中如何計算一年前或一年後的日期? Apr 26, 2023 am 09:22 AM

Java8計算一年前或一年後的日期利用minus()方法計算一年前的日期packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[]args ){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUni

stringbuilder清空的方法有哪些 stringbuilder清空的方法有哪些 Oct 12, 2023 pm 04:57 PM

stringbuilder清空的方法有:1、使用setLength(0)方法清空StringBuilder物件;2、使用delete(0, length)方法清空StringBuilder物件;3、使用replace(0, length, "")方法清空StringBuilder物件;4 、使用new StringBuilder()重新建立一個新的StringBuilder物件。

Java中使用StringBuilder類別的delete()方法刪除字串中的部分內容 Java中使用StringBuilder類別的delete()方法刪除字串中的部分內容 Jul 26, 2023 pm 08:43 PM

Java中使用StringBuilder類別的delete()方法刪除字串中的部分內容String類別是Java中常用的字串處理類,它具有許多常用的方法可用於字串的操作。然而,在某些情況下,我們需要對字串進行頻繁的修改,而String類別的不可變性會導致頻繁的創建新的字串對象,從而影響效能。為了解決這個問題,Java提供了StringBuilder類,它

Go語言怎麼拼接字串 Go語言怎麼拼接字串 Jan 12, 2023 pm 04:25 PM

拼接字串的方法:1.使用「+」號拼接,語法「str = str1 + str2」;2、利用fmt套件的sprintf()函數拼接,語法「str = fmt.Sprintf("%s%d% s", s1, i, s2)」;3、使用join函數拼接;4、利用buffer包的WriteString()函數拼接;5、利用buffer包的Builder()函數拼接。

在Java中將字串轉換為StringBuilder 在Java中將字串轉換為StringBuilder Sep 02, 2023 pm 03:57 PM

StringBuilder類別的append()方法接受String值並將其新增至目前物件。將字串值轉換為StringBuilder物件-取得字串值。附加使用append()方法將字串取得到StringBuilder。範例在下面的Java程式中,我們是將字串陣列轉換為單一StringBuilder物件。 即時示範publicclassStringToStringBuilder{  publicstaticvoidmain(Stringargs[]){&a

Java文件解讀:StringBuilder類別的substring()方法詳細介紹 Java文件解讀:StringBuilder類別的substring()方法詳細介紹 Nov 03, 2023 pm 04:31 PM

Java文件解讀:StringBuilder類別的substring()方法詳細介紹引言:在Java程式設計中,字串的處理是非常常見的操作之一。而Java提供了一系列關於字串處理的類別和方法,其中StringBuilder類別是常用於頻繁字串操作的選擇。在StringBuilder類別中,substring()方法是一個非常有用的方法,用來截取字串的子字串。本文將

使用java的StringBuilder.replace()函數取代指定範圍的字符 使用java的StringBuilder.replace()函數取代指定範圍的字符 Jul 24, 2023 pm 06:12 PM

使用java的StringBuilder.replace()函數取代指定範圍的字元在Java中,StringBuilder類別提供了replace()方法,可以用來取代字串中指定範圍的字元。方法的語法如下:publicStringBuilderreplace(intstart,intend,Stringstr)上面的方法用來取代從索引star

Java如何使用StringBuilder類別的substring()函數截取字串的子字串 Java如何使用StringBuilder類別的substring()函數截取字串的子字串 Jul 24, 2023 pm 12:13 PM

Java如何使用StringBuilder類別的substring()函數截取字串的子字串在Java中,我們經常需要處理字串的運算。而Java的StringBuilder類別提供了一系列的方法,方便我們對字串進行操作。其中,substring()函數可以用來截取字串的子字串。 substring()函數有兩種重載形式,分別是substring(intstar

See all articles