2016-03-21 11 views
7

Ich habe zwei Strings wie folgt:Nutzt der Zuweisungsoperator Speicher in Java?

"yes", "no".

Nun würde Ich mag diese Strings auf zwei Arten vergleichen:

  1. Direkt:
    Beispiel: "yes".equals("no")

  2. Durch die Saiten zu einem gewissen Variablen zugewiesen: Beispiel:

    String string1 = "yes"; 
    String string2 ="no"; 
    string1.equals(string2); 
    

Gibt es in diesen beiden Fällen einen Speicher- oder Leistungsunterschied?

+1

die gleiche Leistung – Andrew

+1

Es ist schwierig, über so kleine Code-Schnipsel nachzudenken. Ob die Variablen an anderer Stelle referenziert werden oder nicht, ob sie zugewiesen sind und ob das Ergebnis von "equals" tatsächlich gespeichert oder verwendet wird, kann sich stark darauf auswirken, welchen Code der Compiler ausgeben soll. – Pharap

+0

Diese Art zu denken über Programmierung führt Sie dazu, unlesbaren Code ohne Leistungssteigerung zu schreiben. – Radiodef

Antwort

14

Es gibt einen sehr kleinen Unterschied (effektiv vernachlässigbar, wir reden hier über Mikro-Optimierung), da die Zeichenfolge in einer lokalen Variablen gespeichert werden sollte, die das zusätzliche Speicherbit auf dem Stack-Frame der entsprechenden Methode benötigt. Während die Konstanten tatsächlich im Konstantenpool gespeichert und gemeinsam genutzt werden. Mit den wahrscheinlichen Optimierungen der JVM basierend auf der Anzahl der Aufrufe wird es keinen Unterschied machen.

Beachten Sie, dass der Bytecode identisch wäre, wenn die Variablen final oder effektiv final (nur einmal zugewiesen) wären, da sie in diesem Fall als Konstanten behandelt werden.

+2

* Beachten Sie, dass es keinen Unterschied geben würde, wenn die Variablen final wären. In diesem Fall werden sie effektiv als Konstanten behandelt. *> Beachten Sie auch, dass der Compiler die Variablen implizit erkennt, wenn sie nicht irgendwo im Code neu zugewiesen werden "final" und führt dieselben Optimierungen durch, wenn das Schlüsselwort 'final' explizit verwendet würde. – errantlinguist

+4

Ich denke nicht, dass der Haufen hier beteiligt ist. Sie sind Verweise auf Strings im Konstantenpool. Die Referenzvariablen werden auf dem Stack, AFAIK, gespeichert. – Puce

+0

In unserem Code, wenn wir diese Aufgabe etwa 100 Mal machen. Dann verbraucht es Speicher und Leistung? –

6

Je nach Compiler könnte es den Platz von 2 zusätzlichen Objektreferenzen auf dem Stapel benötigen, denke ich. Diese sind klein genug, dass Sie sie normalerweise ignorieren können, wenn Sie Ihre Anwendung nicht profiliert haben und Sie dort ein Problem entdeckt haben (sehr unwahrscheinlich).

„Ja“ .equals („no“)

Im wirklichen Code gibt es so gut wie nie eine Situation wie diese, wie Sie bereits wissen würde, wenn zwei Literale die gleichen sind oder nicht.

9

Das Kompilieren dieser Code-Snippets ergibt denselben Bytecode. Daher gibt es keinen Speicherverbrauch oder Leistungsunterschied.

Der Zuweisungsoperator nie verbrauchen Speicher (außer im Fall von Autoboxing: Integer number = 42). Die lokale Variablendeklaration kann Speicher im Stack zuweisen (falls erforderlich), aber Sie sollten die Lesbarkeit des Codes bevorzugen.

+1

Für Nummern, die kleiner als eine Konstante (128?) Sind, verbraucht Autoboxing auch keinen Speicher. – Cephalopod

+1

@Cephalopod Sie haben Recht, für Zahlen in der Reichweite [-128, 127] ist es garantiert von JLS7 5.1.7 – fRoStBiT

+0

Beachten Sie, dass die obere Grenze geändert werden kann, so bezweifle ich, dass es explizit garantiert ist. –