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.