Junior
162
String oluşturmak için new String() kullanmak ile string literal kullanmak arasındaki fark nedir?
AI'dan gelen yanıt
sobes.tech yapay zeka
Bir dize literalı ("abc") kullanıldığında, dize String Havuzunda (String Pool) oluşturulur. Aynı değere sahip bir dize havuzda zaten varsa, mevcut nesneye referans döndürülür. Bu, bellek tasarrufu için bir optimizasyondur.
new String("abc") kullanıldığında, her zaman yeni bir dize nesnesi heap'te (yığın) oluşturulur, hatta aynı değere sahip bir dize havuzda zaten varsa bile.
Örnek:
// "hello" dizesi literalı oluşturulur. Eğer havuzda yoksa, eklenir.
// str1, havuzdaki nesneye referans eder.
String str1 = "hello";
// "hello" literalı tekrar kullanılır. Zaten havuzda olduğu için,
// str2 de aynı nesneye referans eder.
String str2 = "hello";
// Heap'te "hello" değeriyle yeni bir dize nesnesi oluşturulur.
// str3, bu yeni heap nesnesine referans eder, havuzdaki nesneye değil.
String str3 = new String("hello");
// Referans kontrolü:
// str1 ve str2 aynı nesneye referans eder.
System.out.println(str1 == str2); // true
// str1 havuzdaki nesneye, str3 ise heap'teki yeni nesneye referans eder.
System.out.println(str1 == str3); // false
// Değer kontrolü:
// Tüm dizeler aynı değere sahiptir.
System.out.println(str1.equals(str3)); // true
Tablodaki farklar:
| Kriter | Dize Literalı ("abc") |
new String("abc") |
|---|---|---|
| Oluştuğu yer | String Havuzu (String Pool) | Heap (Yığın) |
| Nesne oluşturma | Var olanı döndürür veya yeni oluşturur | Her zaman yeni nesne oluşturur |
| Bellek optimizasyonu | Tekrarlamalar için havuzu verimli kullanır | Çiftler oluşturabilir, daha az verimli |
Referans karşılaştırması (==) |
Aynı değere sahip dizeler için genellikle true |
Aynı değere sahip dizeler için her zaman false |