2012-08-13 4 views
10

una sveltina solo per ottenere la pace della mente:
Considerando la seguenteIs String.length() richiamato per una stringa finale?

final String str = "This is the end"; 

Is str.length() valutati in fase di esecuzione o è hardcoded come 15 nel bytecode?

+3

Il compilatore 'javac' è improbabile che lo ottimizzi, tuttavia il JIT è molto probabile che se si esegue il codice abbastanza per riscaldarlo. –

+0

Perché preoccuparsi? Questo è probabilmente dipendente dall'implementazione di JVM, ma probabilmente sarà veloce sotto e JVM. Se questo risulta essere un collo di bottiglia nelle prestazioni (improbabile) un profiler lo mostrerà. –

+0

Le stringhe sono immutabili in Java. Non importa se fai la variabile 'finale' o no. – Jesper

risposta

12

str.length()è valutato in fase di esecuzione. final significa che il valore del riferimento non può essere modificato. Non ha nulla a che fare con la stringa stessa.

Tuttavia, se si guarda nel codice sorgente di String vedrete che length() restituisce il valore di un campo, in modo che nessun calcolo avviene, il valore os semplicemente leggere ...

2

Nel bytecode verrà valutato il metodo.

Tuttavia, la chiamata al metodo sarà probabilmente inline durante jit compilation

Il codice per lo String.length() metodo è il seguente:

public int length() { 
    return count; 
} 

Io non credo che il fatto che il riferimento la stringa è dichiarata che la finale ha una qualche relazione con l'inlining in questo caso.

+0

E questo significherebbe ... il valore viene valutato @ runtime e quindi codificato da jit? – MadProgrammer