Rumah Java javaTutorial 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);
}
Salin selepas log masuk
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;
}
Salin selepas log masuk
void getChars(char dst[], int dstBegin) {
    System.arraycopy(value, 0, dst, dstBegin, value.length);
}
Salin selepas log masuk

你可以看到一个字符数组被创建,长度则是已有字符和拼接的字符长度之和。然后,它们的值复制到新的字符数组中。最后,用这个字符数组创建一个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";
   }
}
Salin selepas log masuk

上面的代码会被编译成如下字节码:

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
}
Salin selepas log masuk

你可以在这些字节码中看到,使用了StringBuilder。所以我们在Java 8中不再需要使用StringBuilder类。

Atas ialah kandungan terperinci Java8中不再需要StringBuilder拼接字符串的详情介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk mengira tarikh setahun yang lalu atau setahun kemudian di Java 8? Bagaimana untuk mengira tarikh setahun yang lalu atau setahun kemudian di Java 8? Apr 26, 2023 am 09:22 AM

Java8 mengira tarikh setahun yang lalu atau setahun kemudian menggunakan kaedah tolak() untuk mengira tarikh setahun yang lalu packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUni

Tukar rentetan kepada StringBuilder dalam Java Tukar rentetan kepada StringBuilder dalam Java Sep 02, 2023 pm 03:57 PM

Kaedah append() kelas StringBuilder menerima nilai String dan menambahkannya pada objek semasa. Tukar nilai rentetan kepada objek StringBuilder - Dapatkan nilai rentetan. Tambah menggunakan kaedah append() untuk mendapatkan rentetan ke StringBuilder. Contoh Dalam program Java berikut, kami menukar tatasusunan rentetan menjadi objek StringBuilder tunggal. Demonstrasi masa nyata publicclassStringToStringBuilder{ publicstaticvoidmain(Stringargs[]){&a

Gunakan kaedah delete() kelas StringBuilder dalam Java untuk memadam sebahagian daripada kandungan dalam rentetan Gunakan kaedah delete() kelas StringBuilder dalam Java untuk memadam sebahagian daripada kandungan dalam rentetan Jul 26, 2023 pm 08:43 PM

Gunakan kaedah delete() kelas StringBuilder dalam Java untuk memadam sebahagian daripada kandungan dalam rentetan Kelas String ialah kelas pemprosesan rentetan yang biasa digunakan di Java. Ia mempunyai banyak kaedah yang biasa digunakan untuk operasi rentetan. Walau bagaimanapun, dalam beberapa kes, kita perlu kerap mengubah suai rentetan, dan ketidakbolehubah kelas String akan membawa kepada penciptaan objek rentetan baharu yang kerap, sekali gus menjejaskan prestasi. Untuk menyelesaikan masalah ini, Java menyediakan kelas StringBuilder, yang

Cara menggabungkan rentetan dalam bahasa Go Cara menggabungkan rentetan dalam bahasa Go Jan 12, 2023 pm 04:25 PM

Kaedah penyambungan rentetan: 1. Gunakan tanda "+" untuk menyambung, sintaksnya ialah "str = str1 + str2"; 2. Gunakan fungsi sprintf() bagi pakej fmt untuk menyambung, sintaksnya ialah "str = fmt. Sprintf("%s%d% s", s1, i, s2)"; 3. Gunakan fungsi bergabung untuk menyambung; 4. Gunakan fungsi WriteString() pakej penimbal untuk menyambung; 5. Gunakan Pembina pakej penimbal () berfungsi untuk menyambung.

Apakah kaedah untuk mengosongkan stringbuilder? Apakah kaedah untuk mengosongkan stringbuilder? Oct 12, 2023 pm 04:57 PM

Kaedah untuk mengosongkan stringbuilder ialah: 1. Gunakan kaedah setLength(0) untuk mengosongkan objek StringBuilder 2. Gunakan kaedah delete(0, length) untuk mengosongkan objek StringBuilder 3. Gunakan replace(0, length, "; ") kaedah untuk mengosongkan objek StringBuilder; 4. , Gunakan StringBuilder() baharu untuk mencipta semula objek StringBuilder baharu.

Gunakan fungsi StringBuilder.replace() java untuk menggantikan julat aksara yang ditentukan Gunakan fungsi StringBuilder.replace() java untuk menggantikan julat aksara yang ditentukan Jul 24, 2023 pm 06:12 PM

Gunakan fungsi StringBuilder.replace() java untuk menggantikan julat aksara yang ditentukan Dalam Java, kelas StringBuilder menyediakan kaedah replace(), yang boleh digunakan untuk menggantikan julat aksara yang ditentukan dalam rentetan. Sintaks kaedah ini adalah seperti berikut: publicStringBuilderreplace(intstart,intend,Stringstr) Kaedah di atas digunakan untuk menggantikan bintang indeks daripada

Tafsiran dokumentasi Java: Pengenalan terperinci kepada kaedah substring() kelas StringBuilder Tafsiran dokumentasi Java: Pengenalan terperinci kepada kaedah substring() kelas StringBuilder Nov 03, 2023 pm 04:31 PM

Tafsiran dokumentasi Java: Pengenalan terperinci kepada kaedah substring() kelas StringBuilder Pengenalan: Dalam pengaturcaraan Java, pemprosesan rentetan adalah salah satu operasi yang paling biasa. Java menyediakan satu siri kelas dan kaedah untuk pemprosesan rentetan, antaranya kelas StringBuilder ialah pilihan yang biasa digunakan untuk operasi rentetan yang kerap. Dalam kelas StringBuilder, kaedah substring() ialah kaedah yang sangat berguna untuk memintas substring rentetan. Artikel ini akan

Cara menggunakan fungsi subrentetan() kelas StringBuilder dalam Java untuk memintas subrentetan rentetan Cara menggunakan fungsi subrentetan() kelas StringBuilder dalam Java untuk memintas subrentetan rentetan Jul 24, 2023 pm 12:13 PM

Bagaimanakah Java menggunakan fungsi subrentetan() kelas StringBuilder untuk memintas subrentetan rentetan Dalam Java, kita selalunya perlu memproses operasi rentetan. Kelas StringBuilder Java menyediakan satu siri kaedah untuk memudahkan kami mengendalikan rentetan. Antaranya, fungsi substring() boleh digunakan untuk memintas substring rentetan. Fungsi substring() mempunyai dua bentuk terlebih beban, iaitu substring(intstar

See all articles