Sobes.tech
Middle

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.