Yazılım

String ve StringBuilder Sınıflarının Farkı Nedir?

Merhabalar. Bu yazımda String ve StringBuilder sınıflarından kısaca bahsedeceğim. Öncelikle şu kavramları bilmekte fayda var:

  1. Immutable
  2. Mutable

Immutable adından da anlaşılacağı üzere “değişmez” demektir. Java’da immutable sınıf kapsamına giren birçok sınıf mevcuttur. Örneğin; wrapper sınıflar (Boolean, Integer, Short, Byte ve konumuzun başlığı olan String sınıfları gibi) Peki nedir buradaki immutable’dan kasıt? İçeriği, elemanları değiştirelemeyen sınıflara immutable sınıf denir.

Kafanızda şu soru oluşabilir. E ben String veri tipinde bir değişken tanımlıyorum sonra da bunu değiştirebiliyorum? Ön planda görülen evet değişiyor. Peki arka planda da öyle mi? Tabii ki hayır 🙂

Java arka planda öncelikle;

  1. Yeni bir String nesnesi yaratacak
  2. Yarattığı bu yeni nesneye yeni değerinizi atayacak
  3. Eski String değişkeni bu nesnenin referansına işaret edecek

Referans kısmına da aşağıda değiniyor olacağım. 

Örneğin elimizde aynı değere sahip iki adet String veri tipinde değişkenimiz olsun. Bu değişkenleri (==) operatörü ile kıyasladığımızda bize true sonucunu döndürecektir. Bilindiği üzere (==) operatörü referansları karşılaştırmak için kullanılır. Referansların içinde aynı adres, yani aynı nesne mevcutsa sonuç da true olarak dönecektir.

Java, derlenme zamanında, wrapper sınıflara ait değişkenler aynı değerlere sahipse bellekte ayrı alan yaratmaz. “new” ile yeni bir nesne yaratmadığınızı varsayıyorum. Yani yukarıdaki “var1″ ve “var2″ için ayrı alan yaratılmamış olur. Dolayısıyla aynı referans noktalarına sahip olurlar. Bu da performans olarak belleği efektif şekilde kullanmamızı sağlar. Tam tersi durumda ise aynı değerlere sahip olmayan değişkenler için bellekte iki ayrı alan tahsis edilecek ve referansları farklı olacağı için göstereceği sonuç da false olarak dönecektir. 

Buraya kadar immutable ve referans kavramından bahsettik. Peki String ile StringBuilder sınıfı arasındaki temel fark nedir?

Mutable “değişebilir” anlamına da gelmektedir. StringBuilder sınıfı (String sınıfının alt sınıfı da diyebiliriz), String sınıfının tersine mutable’dır. Hatta Oracle dökümanındaki ilk cümlesi de bunu işaret eder:

A mutable sequence of characters.

Dolayısıyla sahip olduğu elemanlar değiştirilebilir. İşte aralarındaki en temel fark budur.

Örneğin (+=) operatörü ile String veri tipine ait iki değişkeni birbiri ardına ekleyebiliriz. Fakat arka planda Java bunun için her seferinde yeni bir nesne yaratmak ve bellekte ayrıca bir alan tahsis etmek zorunda kalacak. Bunu bir döngü ile yaptığınızı düşününce performans açısından ne kadar kötü bir sonuç olduğunu tahmin edebilirsiniz. Her döngüde yeni bir nesne yaratılması bellekte gereksiz alan ayrılmasına yol açacak. Her ne kadar Garbage Collector bu işin üstesinden gelse de burada önemli olan kaliteli kod yazmak. İşte tam burada StringBuilder sınıfı bizim yardımımıza koşuyor. Bu sınıf mutable olduğu için elemanlarının değişebilir olduğunu söylemiştik. Yani StringBuilder nesnesi ile yeni bir nesne yaratılmasına ihtiyaç duyulmadan varolan nesne üzerinde değişiklik yapabiliriz. Bu da bellekten tasarruf ve performansta artış olarak bize geri dönecektir.

Mesela yukarıda bahsedilen örnekte String ile (+=) operatörünü kullanmak yerinde StringBuilder’ın append() methodunu kullanabiliriz. String immutable olduğu için set(), append(), insert() gibi methodlara sahip değildir. StringBuilder sınıfının kullanım şeklini ve String sınıfı ile kıyaslamasını aşağıdaki görsellerde örnek olarak paylaşıyorum. Her iki örnek için de konsola yazdırdığımız bellekte tutuldukları alanları görebilirsiniz. İyi çalışmalar.


String (+=)

 

StringBuilder Append

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir