Heim  >  Artikel  >  Java  >  StringBuilder wird in Java 8 nicht mehr zum Verketten von Zeichenfolgen benötigt

StringBuilder wird in Java 8 nicht mehr zum Verketten von Zeichenfolgen benötigt

巴扎黑
巴扎黑Original
2017-04-30 10:13:201745Durchsuche

Unter Java-Entwicklern ist der hohe Ressourcenverbrauch beim String-Splicing oft ein heißes Thema.

Lassen Sie uns ausführlich besprechen, warum es so viele Ressourcen beansprucht.

In Java ist ein String-Objekt unveränderlich, was bedeutet, dass Sie es nach seiner Erstellung nicht mehr ändern können. Wenn wir also Strings verketten, wird ein neuer String erstellt und der alte vom Garbage Collector markiert.

Wenn wir Millionen von Zeichenfolgen verarbeiten, generieren wir Millionen zusätzlicher Zeichenfolgen, die vom Garbage Collector verarbeitet werden.

Die unterste Ebene der virtuellen Maschine führt beim Spleißen von Zeichenfolgen viele Vorgänge aus. Der direkteste Punktoperator zum Verketten von Zeichenfolgen ist die Operation 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);
}

Sie können sehen, dass ein Zeichenarray erstellt wird und die Länge die Summe der Länge der vorhandenen Zeichen und der verketteten Zeichen ist. Ihre Werte werden dann in ein neues Zeichenarray kopiert. Erstellen Sie abschließend ein String-Objekt aus diesem Zeichenarray und geben Sie es zurück.

Diese Operationen sind also zahlreich. Wenn Sie sie berechnen, werden Sie feststellen, dass die Komplexität O(n^2) ist.

​Um dieses Problem zu lösen, verwenden wir die StringBuilder-Klasse. Es ist wie eine veränderbare String-Klasse. Die Spleißmethode hilft uns, unnötige Duplikate zu vermeiden. Es hat eine Komplexität von O(n), was weitaus besser ist als O(n^2).

Java 8 verwendet jedoch standardmäßig StringBuilder zum Verketten von Zeichenfolgen.

Java 8-Dokumentation:

Um die Leistung der String-Verkettung zu verbessern, kann der Java-Compiler die StringBuffer-Klasse oder eine ähnliche Technologie verwenden, um die Erstellung von String-Zwischenobjekten bei der Verwendung von Auswertungsausdrücken zu reduzieren.

Der Java-Compiler behandelt diese Situation:

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

Der obige Code wird in den folgenden Bytecode kompiliert:

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
}

​An diesen Bytecodes können Sie erkennen, dass StringBuilder verwendet wird. Daher müssen wir die StringBuilder-Klasse in Java 8 nicht mehr verwenden.

Englischer Originaltext: We Don't Need StringBuilder for Concatenation Anymore

Das obige ist der detaillierte Inhalt vonStringBuilder wird in Java 8 nicht mehr zum Verketten von Zeichenfolgen benötigt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn