Jest to kod źródłowy mam:Kiedy i gdzie jest łańcuch inicjalizowany/przechowywany w kodzie źródłowym Java?
public class Koray {
public static void main(String [] args) {
System.out.println("This is a sample program.");
}
}
I kiedy to skompilować, otrzymuję kodu bajtowego. Kiedy patrzę na kod bajtowy z szesnastkowy widza widzę część:
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
które mogą być odczytywane jako
This is a sample program.
jeżeli bajty są interpretowane jako znaki.
I kiedy zrobić
javap -c Koray.class
należy zdemontować tę klasę widać:
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
}
Moje pytanie brzmi, gdzie jest to String widziany w zdemontowanego tekście? Widzę to tylko w komentarzu.
Czy możemy powiedzieć, że nie powinniśmy używać łańcuchów w kodzie źródłowym, ponieważ zapełni to pamięć, gdy klasa zostanie załadowana i nigdy nie zostanie usunięta z pamięć, ponieważ znajduje się w puli stałej? –
@KorayTugay nie martw się, _interned_ Ciągi (i wszystkie literały łańcuchowe są _interned_) są przechowywane w stercie od JDK7. –
@KorayTugay Używaj ich w kodzie źródłowym, jeśli czyni to kod jaśniejszym niż robienie czegoś innego. Obciążenie pamięci stałych łańcuchowych jest pomijalne. – chrylis