Heim  >  Artikel  >  Java  >  Wie vermeide ich unnötige Objekterstellung in Java?

Wie vermeide ich unnötige Objekterstellung in Java?

PHPz
PHPznach vorne
2023-04-24 22:31:051497Durchsuche

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("李子捌");

Richtige Schreibweise

// 正确写法
String name1 = "李子捌";

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

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

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

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen