2016-03-23 13 views
12

Gibt es einen Leistungsvorteil durch die Verwendung einer private final static String in Java vs Verwendung einer lokalen String-Variable, die jedes Mal, wenn auf die Methode zugegriffen wird, "initialisiert" werden muss?Java-Zeichenfolgen: private statische vs. lokale variable Leistung

Ich denke, dass die Verwendung von private static final Strings ist eine gute Übung für Konstanten, die in verschiedenen Teilen einer Klasse wiederverwendet werden, aber wenn eine Zeichenfolge nur in einer Methode verwendet werden sollte, an einem Ort, aus einem ganz bestimmten Grund Keine andere Methode interessiert mich, ich bevorzuge es, die interne Schnittstelle der Klasse sauber zu halten mit weniger privaten Mitgliedern und einfach eine lokale Variable zu verwenden.

Vorausgesetzt, dass Java String Interning hat, und tatsächlich einen Pool mit einer einzelnen Kopie jeder Zeichenfolge, die mit Anführungszeichen (String s = "some string") deklariert wird, würde es tatsächlich einen Leistungseinbruch von der Deklaration/Initialisierung/zuweisen die Variable jeder Zeit Zugriff auf die Methode vs mit einer statischen Zeichenfolge?

Um es ein wenig klarer zu machen, würde es einen Unterschied zwischen der Verwendung von SS oder LS geben?

class c { 
private final static String SS = "myString"; 

    private void method(){ 
    //do something with SS 
    } 

    private void OtherMethod(){ 
    String LS = "myOtherString" 
    //do same thing with LS 
    } 
} 
+1

"* behält einen Pool mit einer einzelnen Kopie jeder anderen Zeichenfolge *" das ist falsch. Die einzigen Strings Java-Praktikanten (es sei denn, Sie rufen 'String.intern()') auf, sind "Anführungszeichen" -Konstanten in Ihrem Code. Zur Laufzeit konstruierte Strings werden im Konstanten-Pool * nicht * interniert. – dimo414

+0

Sie haben Recht, diejenigen, wo diejenigen, die ich bezog, ich bearbeite –

Antwort

7

Die Verwendung einer benannten Konstante ist wahrscheinlich besser für die Wartbarkeit. Jedoch können Konstanten, die zur Kompilierungszeit bekannt sind, inline sein, in welchem ​​Fall es unwahrscheinlich ist, dass sie einen Unterschied aufweisen.

Hinweis: Wenn Sie ein String-Literal verwenden, wird dieses nur einmal erstellt, unabhängig davon, wo in der JVM es verwendet wird.

In diesem Fall besteht der einzige Unterschied darin, eine lokale Variable auf dem Stack zu verwenden, die wahrscheinlich nicht teurer ist als eine Konstante, die inline ist.

gäbe es tatsächlich eine Performance Hit aus mit den Variablen jedes Mal, wenn die Methode

zugegriffen wird zu erklären, wie Java einen statischen Compiler verwendet, eine Variable nur einmal (oder einmal erklärte für jede Kompilierungsstufe) beim Laden der Klasse/Methode, unabhängig davon, wie oft die Methoden aufgerufen werden. Die Variable könnte jedoch jedes Mal initialisiert werden.

2

Die Wahrheit ist, am Ende gibt es keinen Unterschied. Eine konstante Zeichenfolge in einer lokalen Variablen wird immer noch im Konstantenpool enden und optimiert. Im Allgemeinen sind lokale Variablen schneller, weil sie leichter zugänglich sind, aber bei konstanten Strings macht das keinen Unterschied. Wähle also, was in deinem Fall lesbarer und intuitiver ist.

+2

Warum meinst du, dass lokale Variablen schneller als Statik sind ??? –

+0

@Xoce 웃 Пepeúpa eine lokale Variable ist wahrscheinlich etwas schneller als der Zugriff auf ein nicht endgültiges 'statisches' Feld. Konstanten können jedoch inline gesetzt werden, so dass der Unterschied fiktiv ist. –

+0

eine lokale Variable kann sehr gut optimiert werden. in einigen Fällen kann es beseitigt werden. In anderen kann auf sehr schnelle Anweisungen zugegriffen werden, die relativ zum Stapel- oder Basiszeiger arbeiten. Auf statische Variablen muss immer mit ihrer vollen Adresse zugegriffen werden – loonytune