Heim > Java > javaLernprogramm > Hauptteil

Wie vermeide ich unnötige Objekterstellung in Java?

PHPz
Freigeben: 2023-04-24 22:31:05
nach vorne
1531 Leute haben es durchsucht

Einführung

Bei der Java-Entwicklung sollten Programmierer ihr Bestes geben, um die Erstellung von Objekten mit denselben Funktionen zu vermeiden, da dies nicht nur Speicher verbraucht, sondern auch die Ausführungsgeschwindigkeit des Programms beeinträchtigt. Erwägen Sie in diesem Fall die Wiederverwendung von Objekten.

Als nächstes geben wir einige Beispiele für Szenarien, in denen Objekte wiederverwendet werden, um zu sehen, ob wir ausgetrickst wurden. Wenn ja, sollten wir es schnell ändern, bevor es entdeckt wird.

1. String und Boolean

Es scheint keinen Unterschied zwischen den beiden folgenden Schreibweisen zu geben, aber wenn wir die zugrunde liegende JVM genau verstehen, können wir die Eigenschaften des JVM-Laufzeitkonstantenpools nutzen, um die Erstellung von String-Objekten zu vermeiden Dieselben Funktionen (insbesondere in der Schleife erstellt) können eine erhebliche Leistungsoptimierung bewirken und Speicher sparen.

Falsche Schreibweise

// 每次都会创建一个新的String对象,且不会加入常量池
String name2 = new String("李子捌");
Nach dem Login kopieren

Richtige Schreibweise

// 正确写法
String name1 = "李子捌";
Nach dem Login kopieren

Darüber hinaus müssen Programmierer, die gerade Java-Code geschrieben haben, auch die richtige Verwendung der Klassen String, StringBuilder und StringBuffer auswählen. String ist ein unveränderliches Objekt und wird normalerweise zum Definieren unveränderlicher Zeichenfolgen verwendet. StringBuilder und StringBuffer werden in Szenarien mit variablen Zeichenfolgenoperationen verwendet, z. B. beim Zusammenfügen von Zeichenfolgen. StringBuffer ist threadsicher und verwendet das Schlüsselwort Synchronized, um eine Thread-Synchronisierung zu erreichen.

// StringBuffer中的append()方法
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

// StringBuilder中的append()方法
public StringBuilder append(String str) {
    super.append(str);
    return this;
}
Nach dem Login kopieren

Boolean ist ein häufig verwendeter Typ, der in der Entwicklung auch anstelle von new Boolean() verwendet werden sollte. Aus dem Quellcode von Boolean ist ersichtlich, dass die Boolean-Klasse zwei endgültige statische Eigenschaften definiert .valueof() gibt die beiden definierten Eigenschaften direkt zurück, während new Boolean() ein neues Objekt erstellt.

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);
Nach dem Login kopieren

2. Automatisches Unboxing und Boxing

Java bietet automatische Unboxing- und Boxing-Funktionen für grundlegende Datentypen. Bedeutet das, dass wir diese beiden Typen nach Belieben im Code verwenden können? Theoretisch gibt es auf Codeebene zwar kein Problem, aber hinsichtlich der spezifischen Leistung gibt es noch Optimierungspotenzial! ! ! „Testen wir die Leistung.“ Schließlich wird die Codeleistung manchmal nach und nach beeinträchtigt! ! !

3. Reguläre Ausdrücke werden oft verwendet, um zu überprüfen, ob Zeichenfolgen zulässig sind (erkennen Sie das Problem auf den ersten Blick? Ich denke, Sie haben es gesehen)!

long start = System.currentTimeMillis();
Integer sum = 0;
for (int i = 0; i < 100000; i++) {
    sum += i;
}
System.out.println(System.currentTimeMillis() - start);
Nach dem Login kopieren

Die Ausführungszeit dieses Codes beträgt 71 Millisekunden, was ziemlich schnell zu sein scheint!

Wie vermeide ich unnötige Objekterstellung in Java?

Aber wir führen eine sehr einfache Optimierung durch. Der optimierte Code lautet wie folgt:

long start = System.currentTimeMillis();
// 修改Integer 为 int 
int sum = 0;
for (int i = 0; i < 100000; i++) {
    sum += i;
}
System.out.println(System.currentTimeMillis() - start);
Nach dem Login kopieren

Die erneute Ausführung des Codes dauert insgesamt 1 Millisekunde, was 70-mal schneller ist! ! ! Wie vermeide ich unnötige Objekterstellung in Java?

Das liegt daran, dass die Methode String.matches() jedes Mal Pattern.compile(regex) ausführen muss, wenn sie in der Schleife erstellt wird, und die Kosten für die Erstellung einer Patter-Instanz hoch sind, da der reguläre Ausdruck dies tun muss in eine Finite-State-Maschine kompiliert werden. In diesem Fall ignorieren wir häufig Leistungsaspekte, da die Java-API bequemere Methodenaufrufe bietet und oft nicht leicht zu finden ist.

Das obige ist der detaillierte Inhalt vonWie vermeide ich unnötige Objekterstellung in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage