Die Java-Implementierung von hashmap ist nicht in der Lage, den Grund für einige Zeilen zu verstehen. Im folgenden Code kopiert von hier , in der Zeile 365-367, kann ich nicht verstehen, warum sie zuerst die Zuordnung von e.key zu k gemacht haben und dann == mit key [(k = e.key) == Taste]. Warum nicht direkt (e.key == key). Dieses Muster erscheint mehrmals im Code.
%Vor%Ich denke @ marco13 hat die richtigen Links gepostet, die diese Frage beantworten. Einfach die Links erneut posten. Warum wird die Sperre für eine lokale Variable erfasst
?In ArrayBlockingQueue, warum das letzte Mitglied kopieren Feld in lokale endgültige Variable?
Antwort: Die Verwendung der Funktion local reference der Elementvariablen verringert die Größe des generierten Bytecodes.
Dies ist wahrscheinlich eine Frage der Optimierung. Der Aufruf von e.key
fügt eine indirekte Ebene hinzu (wenn Sie den Verweis auf e
verwenden, um einen Verweis auf key
zu erhalten). Die Variable k
ermöglicht eine Verknüpfung für e.key
und vermeidet die doppelte Verwendung dieser unnötigen Indirektion.
Die Implementierung verwendet auch direkt das Ergebnis der Zuweisung k = e.key
, anstatt den Wert k
zuzuweisen und dann k
mit key
zu vergleichen.
Ich weiß nicht, ob die Auswirkung einer solchen Optimierung signifikant ist (Zuweisung einer neuen Variablen gegenüber einem indirekten Zugriff). Es ist wahrscheinlich schwierig, sie zu bewerten, und sie kann von der JVM abhängig sein (da unterschiedliche JVM verschiedene Optimierungen am Code durchführen können).
Da HashMap in Java weit verbreitet ist, soll die Implementierung maximale Leistung bieten, ohne dass eine Optimierung von der Ausführungsumgebung erwartet wird; daher die gemeinsame Verwendung dieses Musters.