Questo è il codice sorgente che ho:Quando e dove viene inizializzata/memorizzata la stringa nel codice sorgente Java?
public class Koray {
public static void main(String [] args) {
System.out.println("This is a sample program.");
}
}
E quando compilo questo, ottengo il bytecode. Quando guardo il bytecode con un visualizzatore esadecimale vedo parte:
19 54 68 69 73 20 69 73 20 61 20 73 61 6D 70 6C 65 20 70 72 6F 67 72 61 6D 2E
che può essere letto come
This is a sample program.
se i byte vengono interpretati come caratteri.
E quando lo faccio
javap -c Koray.class
non smontare questa classe vedo:
Compiled from "Koray.java"
public class Koray {
public Koray();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String This is a sample program.
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: bipush 10
10: istore_1
11: return
}
La mia domanda è, dove è questo String visto nel testo smontato? Lo vedo solo in un commento.
Possiamo dire che non dovremmo usare le stringhe nel codice sorgente perché riempirà la memoria quando la classe viene caricata e non verrà mai rimossa dal memoria perché è nella piscina costante? –
@KorayTugay non ti preoccupare, _interned_ Strings (e tutti i letterali delle stringhe sono _interned_) sono archiviati nell'heap sin da JDK7. –
@KorayTugay Usale nel codice sorgente se rende il codice più chiaro di quello che fa qualcos'altro. Il sovraccarico della memoria delle costanti di stringa è trascurabile. – chrylis