Wie der Titel schon sagt. Das versehentliche Erstellen von Objekten führt zu einer schlechten Leistung. Lassen Sie uns ein wenig darüber nachdenken und es schreiben, um keine nutzlosen Objekte zu erzeugen.
In Java gibt es zwei Typen: primitiven Typ (Basistyp) und Referenztyp. Primitive Typen wie int können nicht in eine Sammlung eingefügt werden. Primitive Werte müssen in die entsprechende Wrapper-Klasse (Integer für int) "eingerahmt" werden, da die Auflistung nur Objektreferenzen enthalten kann. Wenn Sie ein Objekt aus der Sammlung abrufen, erhalten Sie die gespeicherte Ganzzahl. Wenn Sie ein int benötigen, müssen Sie es mit der intValue-Methode aus der Ganzzahl "entpacken". Da die explizite Implementierung eine Quelle der Komplexität darstellt, verfügt Java über automatische Funktionen zum Ein- und Auspacken. Automatisches Boxen für die automatische Konvertierung vom primitiven Typ in die Wrapper-Klasse Die automatische Konvertierung von der Wrapper-Klasse in den primitiven Typ wird als Unboxing bezeichnet.
Primitiver Typ | Wrapper-Klasse |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
Ein Objekt, dessen Status nach seiner Erstellung nicht mehr geändert werden kann.
Dieser Code erstellt bei jeder Ausführung dieses Teils eine neue String-Instanz.
Beispiel 1
String s = new String("stringette"); //Tu das nicht
Das ist in Ordnung
Beispiel 2
String s = "stringette";
Betrachten Sie beispielsweise die Person-Klasse mit der isBabyBoomer-Methode, die bestimmt, ob eine Person eine Babyboom-Generation ist. Beim Schreiben von ↓ werden jedes Mal, wenn die isBabyBoomer-Methode aufgerufen wird, unnötig neue Instanzen von Calender, TimeZone, boomStart und boomEnd Date erstellt. Tu das nicht.
Beispiel 3
public class Person {
private final Date birthDate;
//Lassen Sie andere Felder, Methoden und Konstruktoren weg
//Tu das nicht!
public boolean isBabyBoomer() {
//Unnötige Erzeugung kostspieliger Objekte
Calender gmtCal =
Calender.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calender.JANUARY, 1, 0, 0, 0);
Date boomStart = gmtCal.getTime();
gmtCal.set(1965, Calender.JANUARY, 1, 0, 0, 0);
Date boomEnd = gmtCal.getTime();
return birthDate.compareTo(boomStart) >= 0 &&
birthDate.compareTo(boomEnd) < 0 ;
}
}
Beispiel 4 verbesserte die schlechten Punkte von Beispiel 3. Wenn die Klasse initialisiert wird, werden die Instanzen Calender-Instanz, TimeZone-Instanz, BoomStart und BoomEnd Date nur einmal erstellt. Dies kann eine erhebliche Leistungssteigerung bedeuten, wenn die isBabyBoomer-Methode häufig aufgerufen wird.
Beispiel 4
public class Person {
private final Date birthDate;
//Lassen Sie andere Felder, Methoden und Konstruktoren weg
/**
*Start- und Enddatum des Babybooms.
*/
private static final Date BOOM_START;
private static final Date BOOM_END;
static {
Calender gmtCal =
Calender.getInstance(TimeZone.getTimeZone("GMT");
gmtCal.set(1946, Calender.JANUARY, 1, 0, 0, 0);
BoomStart = gmtCal.getTime();
gmtCal.set(1965, Calender.JANUARY, 1, 0, 0, 0);
BoomEnd = gmtCal.getTime();
}
public boolean osBabyBoomer() {
return birthDate.compareTo(BoomStart) >= 0 &&
birthDate.compareTo(BoomEnd) < 0 ;
}
}
Beispiel 5 ist aufgrund eines Tippfehlers mit einem Buchstaben ziemlich langsam. Die variable Summe wird als Long statt long deklariert. Infolgedessen erstellt das Programm ungefähr 2 ^ 31 unnötige Long-Instanzen. (Jedes Mal, wenn Sie Long i zu Long sum hinzufügen, erhöht sich eine Instanz.)
Lektion: Wählen Sie einen Basisdatentyp gegenüber einem Boxed-Basisdatentyp und achten Sie auf unbeabsichtigtes automatisches Boxen
Beispiel 5
//Ein schrecklich langsames Programm! Können Sie auf die Objekterstellung hinweisen?
public static void main(String[] args) {
Long sum = OL;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
[Read Effective Java] Kapitel 2 Punkt 6 "Veraltete Objektreferenzen entfernen" https://qiita.com/Natsukii/items/5f2edd6a9bcdb94b03e5
Recommended Posts