Sobes.tech
Middle

Java'da dizgelerin bellek içinde nasıl saklandığı nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Java'da, (String) bir dize değiştirilemez bir nesnedir. Değeri, karakter dizisi ile temsil edilir.

Java 9'a kadar, String karakterleri char[] dizisinde saklardı. Her karakter 2 bayt (UTF-16) kaplar.

// Java 9'a kadar
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final char value[]; // Dize karakterleri
    private final int offset;   // Başlangıç ofseti
    private final int count;    // Karakter sayısı (uzunluk)
    // ... diğer alanlar ve metodlar
}

Java 9 ile, bellek tasarrufu için, String ya byte[] dizisi (ASCII/Latin-1 karakterleri için) ya da char[] dizisi kullanabilir. Kodlama durumu coder bayrağı ile belirlenir.

// Java 9'dan itibaren
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final byte[] value; // Dize karakterleri (byte[] veya char[] aslında, coder'a bağlı)
    private final byte coder;   // Kodlama: 0 Latin-1 için, 1 UTF-16 için
    // ... diğer alanlar ve metodlar
}

Dize sabitleri (izin verilen karakterler) ve new String(...) kullanılarak oluşturulan dizeler, "heap" (yığın) üzerinde saklanır.

Dize sabitleri ayrıca, PermGen alanında (Java 8 öncesi) veya MetaSpace'de (Java 8 ve sonrası) bulunan "String Havuzu" (String Pool) içine yerleştirilir. Aynı değere sahip bir dize zaten havuzda varsa, mevcut nesneye referans kullanılır.

String s1 = "hello"; // "hello"'yu String Havuzu'nda oluşturur (varsa), s1 ona referans eder
String s2 = "hello"; // s2, aynı "hello" nesnesine referans eder
String s3 = new String("hello"); // Yeni bir "hello" nesnesi heap'te oluşturur, s3 ona referans eder. "hello" havuzda olabilir

Dizeler değiştirilemez olduğundan, dizenin değeri üzerinde yapılan değişiklikler (örneğin, birleştirme) yeni bir String nesnesinin bellekte oluşturulmasına neden olur.