String, sizin de bildiğiniz gibi Java’da yaygın olarak kullanılan karakter dizisi nesneleridir. İki şekilde String nesnesi oluşturabiliriz. Şöyle ki;
- çift tırnak kullanarak
1 |
String name = "Koray"; |
- new anahtar kelimesi kullanarak
1 |
String name = new String("Koray"); |
Java, bu oluşan Stringleri bir havuzda özel olarak korur.
String Pool Nedir ?
String Pool (String Havuzu), Java Heap Memory’de saklanan bir alandır. Flyweight Tasarım Şablonu örneğidir. String immutable(değişmez) olduğu için ve String intern kavramı uygulanabildiği için Java’da String Pool mümkündür.
Peki, nedir bu String interning ? String Interning, değişmez (immutable) olması gereken her bir farklı String değerinin yalnızca bir kopyasını saklama yöntemidir.
Aşağıdaki örnek ile daha iyi anlayacaksınız.
String Pool, tasarruf sağlar yani boş yere heap de referanslar oluşturmaz. String oluşturmak için çift tırnak kullandığımızda, ilk önce String havuzunda aynı değer ile String’i arar, eğer bulursa referansı döndürür, bulamazsa havuzda yeni bir String oluşturur ve sonra referansı döndürür.
new operatörü kullanılarak, heap alanında yeni bir String nesnesi oluşturmuş oluruz. Havuza yerleştirmek için intern() yöntemini kullanabilir ve havuzda bu String nesnenin içerdiği dizeye bakılır, bulunursa havuzdaki dize döndürülür. Aksi takdirde, bu String nesnesi havuza eklenir ve bu String nesnesine bir referans döndürülür.
Unutmayınız ki; new operatörü her zaman yeni bir referans oluşturur ve == ile nesnelerin referanslarının eşitliğini kontrol eder. Bu bilgiler ışığında aşadaki örneğin çıktılarını bilebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
String s1 = "Koray"; String s2 = "Koray"; String s3 = new String("Koray"); String s4 = "Ko" + "ray"; String s5 = "ray"; String s6 = s3.intern(); System.out.println("s1 == s2 : " + (s1 == s2)); System.out.println("s1 == s3 : " + (s1 == s3)); System.out.println("s4 == s1 : " + (s4 == s1)); System.out.println("s4 == s3 : " + (s4 == s3)); System.out.println("Ko + s5 == s1 : " + ("Ko" + s5 == s1)); System.out.println("s2.intern() == s3.intern() : " + (s2.intern() == s3.intern())); System.out.println("s6 == s3 : " + (s6 == s3)); System.out.println("s6 == s2 : " + (s6 == s2)); |
Çıktı
1 2 3 4 5 6 7 8 |
s1 == s2 : true s1 == s3 : false s4 == s1 : true s4 == s3 : false Ko + s5 == s1 : false s2.intern() == s3.intern() : true s6 == s3 : false s6 == s2 : true |