2016-03-21 11 views
7

Mam dwa ciągi jak poniżej:Czy operator przypisania zużywa pamięć w języku Java?

"yes", "no".

Teraz chciałbym porównać te łańcuchy na dwa sposoby:

  1. bezpośrednio:
    Przykład: "yes".equals("no")

  2. Przypisując struny do jakiejś zmiennej: Przykład:

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

Czy w tych dwóch przypadkach występuje różnica w pamięci lub wydajności?

+1

taka sama wydajność – Andrew

+1

Trudno jest wnioskować o takich małych fragmentach kodu. To, czy zmienne są przywoływane gdzie indziej, czy są one przypisane i czy wynik "równości" jest rzeczywiście przechowywany lub używany, może znacząco wpłynąć na to, jaki kod decyduje się wydać kompilator. – Pharap

+0

Ten sposób myślenia o programowaniu poprowadzi Cię do napisania nieczytelnego kodu bez zwiększenia wydajności. – Radiodef

Odpowiedz

14

Istnieje bardzo niewielka różnica (właściwie pomijalne, mówimy tutaj o mikrooptymalizacji), ponieważ ciąg powinien być przechowywany w zmiennej lokalnej, która pobiera dodatkowy bit pamięci na ramce stosu odpowiedniej metody. Podczas gdy stałe są faktycznie przechowywane w stałej puli i udostępniane. Przy prawdopodobnych optymalizacjach JVM w oparciu o liczbę wywołań, nie będzie to miało znaczenia.

Należy zauważyć, że kod bajtowy byłby taki sam, gdyby zmienne były final lub skutecznie final (przypisane tylko raz), ponieważ w tym przypadku są traktowane jako stałe.

+2

* Zauważ, że nie byłoby różnicy, gdyby zmienne były ostateczne, w którym to przypadku są one faktycznie traktowane jako stałe. *> Należy również pamiętać, że biorąc pod uwagę, że zmienne nie są ponownie przypisane gdzie indziej w kodzie, kompilator rozpozna je jako niejawnie "final" i wykonaj te same optymalizacje, które zostałyby wykonane, gdyby słowo kluczowe "final" zostało jawnie użyte. – errantlinguist

+4

Nie sądzę, że sterty są tutaj zaangażowane. Są to odniesienia do ciągów w puli stałej. Zmienne referencyjne są przechowywane na stosie, AFAIK. – Puce

+0

W naszym kodzie, jeśli wykonamy to zadanie około 100 razy. Czy to pochłania pamięć i wydajność? –

6

W zależności od kompilatora może to zająć 2 dodatkowe odniesienia do obiektu na stosie. Są one na tyle małe, że zazwyczaj można je zignorować, chyba że profilujesz aplikację i zauważyłeś tam problem (bardzo mało prawdopodobne).

„tak” .equals („nie”)

W prawdziwym kodzie nie ma prawie nigdy taka sytuacja, jak byś już wiedzieć, czy 2 literały są takie same czy nie.

9

Kompilowanie tych fragmentów kodu spowoduje, że będzie ten sam kod. W związku z tym nie ma różnicy w zużyciu pamięci ani wydajności.

Operator przypisania nigdy zużywają pamięci (z wyjątkiem przypadku autoboxing: Integer number = 42). Lokalna deklaracja zmiennych może przydzielić pamięć w stosie (jeśli to konieczne), ale powinieneś preferować czytelność kodu.

+1

Dla liczb mniejszych od pewnej stałej (128?), Autoboxing nie zużywa również pamięci. – Cephalopod

+1

@ Głowy głowonowa Masz rację, dla liczb w zakresie [-128, 127] jest to gwarantowane przez JLS7 5.1.7 – fRoStBiT

+0

Zauważ, że górna granica może być zmodyfikowana, więc wątpię, by była wyraźnie zagwarantowana. –

Powiązane problemy