Heim  >  Artikel  >  Java  >  So verwenden Sie die Initialisierung mit doppelten Klammern in Java

So verwenden Sie die Initialisierung mit doppelten Klammern in Java

WBOY
WBOYnach vorne
2023-04-18 11:13:021310Durchsuche

Zufällig habe ich eine Möglichkeit gesehen, ein Objekt zu initialisieren:

    // 新建一个列表,并赋值 "Harry","Tony","Tom"
    ArrayList<String> friends = new ArrayList<String>() {{
        add("Harry");
        add("Tony");
        add("Tom");
    }};

Natürlich wird die gleiche Initialisierungsmethode auch für die Map-Sammlung verwendet:

    // 新建一个Map,并赋值
    Map<String, Object> cat = new HashMap<String, Object>() {{
        put("name", "Tom");
        put("age", 10);
    }};

Hier wird die Syntax der inneren Klasse verwendet, als das Objekt zuerst neu zu erstellen und dann der Reihe nach hinzuzufügen, viel bequemer und prägnanter. Diese Methode wird als „Initialisierung mit doppelter Klammer“ (Initialisierung mit doppelter Klammer) bezeichnet.

Verstehen dieser Methode

Nehmen Sie die Initialisierung von ArrayList als Beispiel. Die erste Schicht aus geschweiften Klammern definiert zunächst eine anonyme interne Klasse, die von ArrayList geerbt wurde Initialisierungsblock)

    ArrayList<String> friends = new ArrayList<String>() {
        // 这里什么操作都没有,全部继承自父类(ArrayList)
    };

Wir erhalten eine Instanziierung der Unterklasse von ArrayList über new und wandeln sie dann in eine Referenz auf ArrayList um

    new ArrayList<String>() {
        // 这里什么操作都没有,全部继承自父类(ArrayList)
    };

    Die Freunde, die wir erhalten, sind eigentlich Referenzen auf die Unterklasse von ArrayList, aber es gibt keine Änderung in der Funktionalität
  • Es ist viel einfacher als die normale Standardmethode zum Initialisieren (aber die Lesbarkeit des Codes wird relativ schlecht sein)
  • Effizienzprobleme

Es ist möglich, doppelte geschweifte Klammern zu verwenden, um eine Sammlung in Bezug auf zu initialisieren Effizienz Nicht so gut wie der Standardschritt zur Initialisierung der Sammlung. Der Grund dafür ist, dass die Verwendung doppelter geschweifter Klammern zur Initialisierung zur Generierung interner Klassendateien führt und dieser Prozess die Ausführungseffizienz des Codes beeinträchtigt.

Überprüfen Sie zunächst die .class-Dateien, die durch verschiedene Initialisierungsmethoden generiert wurden.

Zum Beispiel der folgende Code:

    ArrayList<String> friends = new ArrayList<String>() {{}};

Test1 Die generierte .class-Liste nach der Kompilierung lautet:

Test1$1.class
Test1$2.class

Test1$3 .class
Test1 $ 4.CLASS
TEST1 $ 5. CLASS
& HELLIP; & HELLIP;
& HELLIP; SNIP & HELLIP; Kompilierung Die .class-Liste lautet:


Test2.class

Es wird nur 1 .class-Datei generiert

Laufzeit

Das erste ausgeführte Code-Ergebnis von Test1:

1508379452224

1508379452784

Laufzeit: 560 Millisekunden

Das Ergebnis der zweiten Ausführung von Code Test2:

1508379671505

1508379671507

Die Laufzeit beträgt: 2 Millisekunden

Obwohl sich diese Zeitlücke je nach Computerleistung und Betriebsstatus ändert, kann sie auch die doppelte Hauptursache erklären Die Initialisierungsmethode mit Klammern dauert länger als die herkömmliche Methode

Zusammenfassend lässt sich sagen, dass die Initialisierungsmethode mit doppelten Klammern weniger effizient ist als die herkömmliche Methode (wenn die Testinitialisierungsdaten geringer sind (die Liste hat den kritischen Punkt für die automatische Inkrementierung nicht erreicht)):

1. Die Initialisierungsmethode mit doppelter Klammer generiert mehr .class-Dateien als die herkömmliche Methode

2 Die Ausführung mit der Initialisierungsmethode mit doppelter Klammer dauert länger als die herkömmliche Methode

Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Initialisierung mit doppelten Klammern 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