2016-03-23 12 views
12

Esiste un vantaggio in termini di prestazioni utilizzando uno private final static String in java vs utilizzando una variabile stringa locale che deve essere "inizializzata" ogni volta che si accede al metodo?Stringhe Java: prestazioni statiche private vs variabili locali

Penso che l'uso delle stringhe private static final sia una buona pratica per le costanti che vengono riutilizzate in diverse parti di una classe, tuttavia se una stringa dovesse essere utilizzata solo in un metodo, in una posizione, per un motivo molto specifico che nessun altro metodo è preoccupato, in realtà preferisco mantenere l'interfaccia interna della classe pulita con meno membri privati ​​e usare solo una variabile locale.

Dato che Java ha String internato, e in realtà mantiene un piscina con una sola copia di ogni stringa che viene dichiarata utilizzando le virgolette (String s = "some string"), sarebbe in realtà ci sia un calo di prestazioni da dover dichiarare/inizializzazione/assegnare la variabile ogni tempo in cui si accede al metodo utilizzando una stringa statica?

Per rendere un po 'più chiaro, ci sarebbe alcuna differenza tra l'utilizzo di SS o LS?

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

"* mantiene un pool con una singola copia di ogni stringa diversa *" questo non è corretto. Le sole stringhe di interni di Java (a meno che non si chiami 'String.intern()') sono '' quoted ''costanti nel codice. Le stringhe costruite in fase di esecuzione * non * sono internate nel pool di costanti. – dimo414

+0

hai ragione, quelli in cui quelli a cui mi riferivo, io modificherò –

risposta

7

L'utilizzo di una costante denominata è probabilmente migliore per la manutenibilità. Tuttavia, le costanti note al momento della compilazione possono essere sottolineate, nel qual caso è improbabile che vi sia alcuna differenza.

Nota: se si utilizza un valore letterale String, questo verrà creato solo una volta, indipendentemente dalla posizione nella JVM utilizzata.

In questo caso, l'unica differenza consiste nell'utilizzare una variabile locale nello stack che è improbabile che sia più costosa di una costante che è stata sottolineata.

potrebbe esserci effettivamente un calo di prestazioni di dover dichiarare la variabile ogni volta che il metodo si accede

Come Java usa un compilatore statico, una variabile è solo dichiarato volta (o una volta in ogni fase della compilazione), quando si carica la classe/metodo, indipendentemente dal numero di volte in cui vengono chiamati i metodi. Tuttavia, la variabile potrebbe essere inizializzata ogni volta.

2

La verità è che, alla fine, non c'è differenza. Una stringa costante in una variabile locale finirà comunque nel pool costante e ottimizzata. Quindi, in generale, le variabili locali sono più veloci perché sono più facili da accedere, ma nel caso di stringhe costanti non fa differenza. Quindi scegli quello che è più leggibile e intuitivo nel tuo caso.

+2

perché intendi che le variabili locali sono più veloci della statica ??? –

+0

@Xoce 웃 Пepeúpa una variabile locale è probabile che sia leggermente più veloce dell'accesso a un campo 'statico' non finale. Tuttavia, le costanti possono essere sottolineate in modo che la differenza sia teorica. –

+0

una variabile lokal può essere ottimizzata molto bene. in alcuni casi può essere eliminato. in altri è possibile accedervi utilizzando istruzioni molto veloci che funzionano in base allo stack o al puntatore di base. le variabili statiche devono sempre essere accessibili usando il loro indirizzo completo – loonytune

Problemi correlati