Warum ist die switch-Anweisung schneller, als wenn sonst für einen String in Java 7?
In Java 7 eine string
Objekt kann in der Ausprägung eines switch
- Anweisung. Kann jemand erklären, die unter Anweisung von offizielle Dokumentation?
Erzeugt der Java-compiler im Allgemeinen effizienter bytecode von switch-Anweisungen verwenden String-Objekte als von verketteten if-then-else-Anweisungen.
- Sicher. Er übersetzt dies: Wenn Sie vergleichen von Zeichenfolgen in eine große Menge von if-than-else-Anweisungen, die Sie verwenden sollten, statt Schalter
- Welchen Teil der Aussage verstehst du nicht?
- Nicht string-spezifischen version: stackoverflow.com/questions/2086529/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java-Code
Dass zwei Versionen einer Klasse, z.B.
Mit
if-then-else
:Mit
switch
:Bytecode
Werfen wir einen Blick auf den bytecode. Immer den bytecode für
if-then-else
version:Immer den bytecode für
switch
version:Fazit
In der ersten version vergleicht den string durch aufrufen der
equals
- Methode für jeden Zustand, bis es gefunden ist.In der zweiten version ist die erste
hashCode
des Strings. Dann ist dies im Vergleich mit den WertenhashCode
jedercase
. Finden Sie dielookupswitch
. Wenn diese Werte wiederholt passiert einfach, um den code auszuführen, der für diecase
. Ansonsten rufen Sie dieequals
Methode die Fälle gebunden. Dies ist viel schneller als je Anruf dieequals
Methode nur.switch
auf Zeichenfolgen können schneller aus dem gleichen Grund, warum eine Suche in einer hash-set von strings kann schneller sein als eine Suche in einer Liste von strings: Sie können eine Suche inO(1)
anstatt inO(N)
, woN
ist die Anzahl der Saiten.Daran erinnern, dass
switch
ist effizienter als eine Kette vonif-then-else
Aussagen, weil es ist ein berechneter Sprung: ein offset im code berechnet wird basierend auf dem Wert, und dann der Sprung zu dieser offset ausgeführt wird. Java kann ziehen einen ähnlichen trick auf strings mit der Mechanismus ähnlich, dass beschäftigte in den hash-maps und hash-sets.Es ist effizienter, so etwas wie:
als der Korrespondent:
ich denke, was es bedeutet, oder was ich verstehe ist, dass der bytecode (wenn Sie kompilieren Sie Ihre java-Klasse), erstellt aus einer switch-Anweisung mit string ist schneller und effizienter als die bytecode, der erstellt wird, aus einer if-else-Anweisung mit string. beide können die gleiche Arbeit, bit-Schalter ist offensichtlich effizienter.
ist besser als