Sobes.tech
Junior

Java'da string havuzu nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

String havuzu (String pool), Java'nın yığın (heap) belleğinde özel bir alan olup, burada string literal'leri ve içe aktarılmış (interned) string'ler saklanır. Ana amacı, aynı string değerlerinin tekrar kullanımıyla bellek tasarrufu sağlamaktır.

Nasıl çalışır:

Bir string literal oluşturulduğunda (örneğin, "merhaba"), JVM önce aynı değere sahip bir string'in zaten havuzda olup olmadığını kontrol eder.

  • Eğer string varsa: JVM, havuzdaki mevcut nesneye referans döner, yeni bir nesne oluşturmak yerine.
  • Eğer string yoksa: JVM, havuzda yeni bir String nesnesi oluşturur ve ona referans döner.

String oluşturma ve havuz:

  1. String literal kullanarak:
    // "merhaba" bir string literal'idir
    String s1 = "merhaba";
    String s2 = "merhaba";
    // s1 ve s2 aynı nesneye referans eder
    
  2. new String() yapıcısı kullanarak:
    String s3 = new String("dünya");
    String s4 = new String("dünya");
    // s3 ve s4 farklı nesnelere referans eder, değerleri aynı olsa da.
    // "dünya" string literal'ı havuzda olabilir, ama s3 ve s4 nesneleri dışında.
    
  3. intern() metodu kullanarak:
    String s5 = new String("java");
    // intern() metodu, havuzda böyle bir string olup olmadığını kontrol eder
    String s6 = s5.intern();
    // Eğer varsa, havuzdaki nesneye referans döner.
    // Yoksa, şu anki string'i havuza ekler ve referansını döner.
    

String havuzunun avantajları:

  • Bellek tasarrufu: Çiftlenmiş string nesne sayısını azaltır.
  • Performans artışı: Literal string karşılaştırması (==) equals() kullanmaktan daha hızlı olabilir, eğer her iki operand da aynı nesneye referans ediyorsa.

Önemli not:

String karşılaştırmasında == operatörü, iki değişkenin aynı nesneye referans edip etmediğini kontrol eder. String'lerin içeriğini karşılaştırmak için her zaman equals() metodunu kullanın.

String str1 = "abc"; // Havuzda
String str2 = "abc"; // Havuzda, aynı referans
String str3 = new String("abc"); // Havuz dışında
String str4 = str3.intern(); // Havuzda, aynı referans, str1 ve str2 ile

System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str4); // true
System.out.println(str1.equals(str3)); // true