Java dilində sətirlər yaddaşda necə saxlanılır?
sobes.tech Süni İntellekt
AI-dan cavab
Java-da, sətir (String) dəyişməz bir obyektdir. Onun dəyəri simvollar ardıcıllığı ilə təmsil olunur.
Java 9-a qədər, String simvolları char[] massivində saxlayırdı. Hər bir simvol 2 bayt (UTF-16) tuturdu.
// Java 9-a qədər
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // Sətirin simvolları
private final int offset; // Başlanğıc ofseti
private final int count; // Simvolların sayı (uzunluq)
// ... digər sahələr və metodlar
}
Java 9-dan etibarən, yaddaş qənaəti üçün, String ya byte[] massivindən (ASCII/Latin-1 simvolları üçün), ya da char[] massivindən istifadə edə bilər. Kodlaşdırma coder bayrağı ilə müəyyən edilir.
// Java 9-dan
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value; // Sətirin simvolları (byte[] və ya char[] əsasən, coder-dən asılıdır)
private final byte coder; // Kodlaşdırma: 0 Latin-1 üçün, 1 UTF-16 üçün
// ... digər sahələr və metodlar
}
Sətir literalları (icazə verilən simvollar) və new String(...) operatoru ilə yaradılan sətirlər "heap" yaddaşında saxlanılır.
Sətir literalları həmçinin "String Pool"-a yerləşdirilir, bu da PermGen yaddaş sahəsində (Java 8-ə qədər) və ya MetaSpace-də (Java 8-dən sonra) yerləşir. Əgər eyni dəyərə malik sətir artıq pool-da mövcuddursa, mövcud obyektə istinad istifadə olunur.
String s1 = "hello"; // "hello"-yu String Pool-da yaradır (əgər yoxdursa), s1 ona istinad edir
String s2 = "hello"; // s2, eyni "hello" obyektinə istinad edir
String s3 = new String("hello"); // Yeni "hello" obyekti heap-da yaradılır, s3 ona istinad edir. "hello" String Pool-da ola bilər
Sətirlər dəyişməz olduğundan, sətir dəyərinin dəyişdirilməsi (məsələn, birləşdirmə) yeni String obyekti yaradılmasına səbəb olur.