Java8中不再需要StringBuilder拼接字符串的详情介绍
在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类。
Atas ialah kandungan terperinci Java8中不再需要StringBuilder拼接字符串的详情介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



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

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 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

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.

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 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 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

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
