Ich bin neu in Programmierung und Java. Ich habe festgestellt, dass es in der Java-API Methoden mit seltsamen Zuweisungen in if-Anweisungen gibt.
Hier ist ein Beispiel von der Map-Schnittstelle:
%Vor% Gibt es irgendeine Art von Vorteil, um die Aufgabe auf diese Weise zu verschachteln? Ist das eine reine Stilwahl? Warum nicht einfach die Zuweisung machen, wenn curValue
zuerst deklariert wird?
Ich habe das in vielen der neu hinzugefügten Java 8-Methoden in der Map-Oberfläche und anderswo bemerkt. Diese Form der Verschachtelung der Zuweisung scheint unnötig.
Bearbeiten: ein weiteres Beispiel aus der Map-Oberfläche:
%Vor%Es gibt fast keinen Unterschied im generierten Bytecode (Ein Befehlsunterschied): Ссылка
Ich schrieb dies, um die Anweisungen zu generieren und sie hübsch auszudrucken:
%Vor% Verwendung: new Acid().print();
Ausgabedifferenz ist eine einzelne DUP
Anweisung gegen ALOAD
Anweisung ..
Für diejenigen, die sagen ... Nun, Ihre Schnittstelle ist nicht die Schnittstelle des Java JDK. Ich habe auch einen Vergleich gemacht: Ссылка .
Ich bin sehr zuversichtlich, dass JIT sie als den exakt gleichen Code sehen wird, unabhängig davon, ob Sie die Variable außerhalb der if-Anweisung oder innerhalb davon initialisieren.
Der obige Code wurde ausgeführt:
%Vor%Alles in allem ist es persönliche Vorlieben ..
Was das tut, ist eigentlich Kopieren in eine lokale Variable, das erzeugt einen kleineren Byte-Code, und es wird als eine absolute extreme Art der Optimierung gesehen, werden Sie Sehen Sie dies an zahlreichen anderen Stellen im jdk-Code.
Eine andere Sache ist, dass das Lesen einer lokalen Variablen mehrere Male bedeutet, dass eine gemeinsam genutzte Variable nur einmal gelesen wird, wenn dies zum Beispiel ein volatile
wäre und Sie es nur einmal lesen würden und damit innerhalb der Methode arbeiten würden.
BEARBEITEN
Der Unterschied zwischen den beiden Herangehensweisen ist ein einzelner Lesevorgang WIE ICH KANN
Angenommen, wir haben diese zwei Methoden:
%Vor% Der Byte-Code dafür ist fast identisch, außer dass replaceSecond
haben wird:
Während die replace
-Methode sein wird:
Nach meinem Verständnis zählt dup
nicht als ein weiterer Lesevorgang, also denke ich, dass dies eine extreme Optimierung ist?