


So verwenden Sie den StringBuilder von Java in Hochleistungsszenarien richtig
Korrekte Verwendung von StringBuilder in Hochleistungsszenarien
Über StringBuilder denken die meisten Schüler einfach daran, dass Sie StringBuilder zum String-Spleißen verwenden sollten, nicht + verwenden und StringBuffer nicht verwenden sollten, dann ist die Leistung am besten, stimmt das? ? Wirklich?
Einige Schüler haben auch drei besondere Erfahrungen gehört:
1. Nach der Java-Kompilierung und -Optimierung ist StringBuilder nicht threadsicher und es ist besser, es zu verwenden von „security“ StringBuffer;
3. Spleißen Sie die Zeichenfolge der Protokollinformationen niemals selbst, sondern überlassen Sie es slf4j.
1. Die anfängliche Länge ist so wichtig, dass sie es verdient, viermal erwähnt zu werden.
StringBuilder enthält ein char[], und konstantes append() ist der Prozess des ständigen Ausfüllens von char[].
Die Standardlänge von char[] bei Verwendung von new StringBuilder() beträgt 16. Was soll ich dann tun, wenn ich das 17. Zeichen anhängen möchte?
Verwenden Sie System.arraycopy, um das Kopieren zu verdoppeln und die Kapazität zu erweitern! ! ! !
Auf diese Weise fallen Kosten für das Kopieren des Arrays an, und zweitens wird auch das ursprüngliche Zeichen [] verschwendet und geht durch GC verloren. Wie Sie sich vorstellen können, wurde eine Zeichenfolge mit 129 Zeichen viermal kopiert und verworfen, 16, 32, 64 und 128, und insgesamt wurden dem Array 496 Zeichen zugewiesen. In einem Hochleistungsszenario ist dies fast der Fall unerträglich.
Wie wichtig ist es also, einen vernünftigen Anfangswert festzulegen.
Aber was ist, wenn ich wirklich nicht gut schätze? Solange die Saite am Ende größer als 16 ist, ist es besser, die Kapazität zu verdoppeln, auch wenn sie etwas verschwendet ist.
2. Die StringBundler-Klasse von Liferay bietet eine weitere Idee der Längeneinstellung. Beim Anhängen () werden die Dinge nicht in Eile in char[] gestopft, sondern zunächst ein String[]. Speichern Sie sie alle Addieren Sie am Ende die Längen aller Strings, um einen StringBuilder mit angemessener Länge zu erstellen.
3. Allerdings wird das Doppelte des Zeichens[] immer noch verschwendet
Die Verschwendung erfolgt im letzten Schritt, StringBuilder.toString()
// Erstellen Sie eine Kopie, geben Sie das Array nicht freireturn new String(value , 0, count); Der Konstruktor von
String verwendet System.arraycopy(), um das eingehende Zeichen[] zu kopieren, um Sicherheit und Unveränderlichkeit zu gewährleisten. Wenn die Geschichte so endet, wird das Zeichen[] in StringBuilder immer noch verschwendet . geopfert.
Um diese char[] nicht zu verschwenden, besteht eine Möglichkeit darin, verschiedene schwarze Technologien wie Unsafe zu verwenden, um den Konstruktor zu umgehen und dem char[]-Attribut von String direkt einen Wert zuzuweisen, aber nur wenige Leute tun dies.
Eine weitere zuverlässigere Methode ist die Wiederverwendung von StringBuilder. Die Wiederverwendung löst auch das vorherige Problem der Längeneinstellung, denn selbst wenn die Schätzung zu Beginn nicht genau ist, reicht sie nach einigen weiteren Erweiterungen aus.
4. StringBuilder wiederverwenden
Diese Methode stammt aus der BigDecimal-Klasse im JDK (es ist in Ordnung, zu sehen, wie wichtig der JDK-Code ist, der den Code in StringBuilderHolder extrahiert, der nur eine Funktion hat: public StringBuilder getStringBuilder(). ) {
sb .setLength(0);return sb;
}Die Funktion StringBuilder.setLength() setzt nur ihren Zählzeiger zurück, während char[] weiterhin wiederverwendet wird und toString() auch den aktuellen zurücksetzt count-Zeiger. Übergeben Sie ihn als Parameter an den String-Konstruktor, sodass Sie sich keine Sorgen machen müssen, dass alte Inhalte übergeben werden, die die Größe des neuen Inhalts überschreiten. Es ist ersichtlich, dass StringBuilder vollständig wiederverwendbar ist.
Um Parallelitätskonflikte zu vermeiden, wird dieser Halter im Allgemeinen auf ThreadLocal gesetzt. Informationen zu Standardschreibmethoden finden Sie in den Kommentaren von BigDecimal oder StringBuilderHolder.
5. + und StringBuilder
String s = „hello“ + user.getName();
Die Wirkung dieses Satzes nach der Javac-Kompilierung entspricht tatsächlich der Verwendung von StringBuilder, die Länge ist jedoch nicht festgelegt.String s = new StringBuilder().append(“hello”).append(user.getName());Aber wenn es so ist:
String s = “hello”;Jede Anweisung generiert einen neuen StringBuilder. Hier gibt es zwei StringBuilder, und die Leistung ist völlig unterschiedlich. Wenn s+=i; im Schleifenkörper steht, wird es noch lächerlicher.// Nach einigen anderen Anweisungen
s = s + user.getName();
6. StringBuffer und StringBuilderStringBuffer und StringBuilder erben beide von AbstractStringBuilder. Der einzige Unterschied besteht darin, dass StringBuffer-Funktionen das synchronisierte Schlüsselwort haben. Für diejenigen Studenten, die sagen, dass StringBuffer „sicher“ ist: Wann haben Sie tatsächlich gesehen, dass mehrere Threads abwechselnd einen StringBuffer anhängen? ? ? 7. Überlassen Sie das Spleißen der Protokollzeichenfolge immer slf4j??Laut R University werden die fleißigen JVM-Ingenieure hart daran arbeiten, benachbarte (ohne Steueranweisungen) StringBuilder gemäß +XX:+OptimizeStringConcat (standardmäßig nach JDK7u40 geöffnet) während der Laufoptimierungsphase zu kombinieren .
Verwenden Sie also sicherheitshalber weiterhin StringBuilder und legen Sie die Länge selbst fest.
logger.info("Hello {}", user.getName());
Überlassen Sie es bei Protokollen, von denen Sie nicht wissen, ob sie ausgegeben werden sollen Durch die Verknüpfung mit slf4j können in der Tat Kosten gespart werden, indem die Ausgabe nur dann gespleißt wird, wenn sie wirklich benötigt wird.Aber für Protokolle, die ausgegeben werden müssen, ist es schneller, StringBuilder zu verwenden, um sie selbst zu verbinden. Denn wenn man sich die Implementierung von slf4j ansieht, handelt es sich tatsächlich nur um einen konstanten indexof("{}"), einen konstanten subString() und die ständige Verwendung von StringBuilder zum Zusammensetzen. Es gibt kein Allheilmittel.
PS. Der StringBuilder in slf4j reserviert 50 Zeichen außerhalb der ursprünglichen Nachricht. Wenn sich die Variablenparameter auf mehr als 50 Zeichen summieren, müssen sie trotzdem kopiert und erweitert werden ... und der StringBuilder wird nicht wiederverwendet.
Das obige ist der detaillierte Inhalt vonSo verwenden Sie den StringBuilder von Java in Hochleistungsszenarien richtig. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Spring Boot vereinfacht die Schaffung robuster, skalierbarer und produktionsbereiteter Java-Anwendungen, wodurch die Java-Entwicklung revolutioniert wird. Der Ansatz "Übereinkommen über Konfiguration", der dem Feder -Ökosystem inhärent ist, minimiert das manuelle Setup, Allo
