Dies ist der Quellcode ich habe:Wann und wo wird der String im Java-Quellcode initialisiert/gespeichert?
public class Koray {
public static void main(String [] args) {
System.out.println("This is a sample program.");
}
}
Und wenn ich diese kompilieren, erhalte ich die Bytecode. Als ich bei der Bytecode mit einem Hexadezimal-Viewer betrachten sehe ich Teil:
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
die als
gelesen werden kannThis is a sample program.
wenn der Bytes als Zeichen interpretiert werden.
Und wenn ich
javap -c Koray.class
diese Klasse zerlegen ich sehe:
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
}
Meine Frage ist, wo ist dieser String im demontierten Text gesehen? Ich sehe es nur in einem Kommentar.
Können wir sagen, dass wir keine Zeichenfolgen im Quellcode verwenden sollten, weil es den Speicher füllt, wenn die Klasse geladen wird und nie aus dem entfernt wird Speicher, weil es im konstanten Pool ist? –
@KorayTugay keine Sorge, _interned_ Strings (und alle String-Literale sind _interned_) werden seit JDK7 im Heap gespeichert. –
@KorayTugay Verwenden Sie diese im Quellcode, wenn sie den Code klarer machen als etwas anderes. Der Speicherbedarf von String-Konstanten ist vernachlässigbar. – chrylis