Java’da String, StringBuilder ve StringBuffer sınıflarını inceleyip birbirlerine göre avantaj ve dezavantajlarından bahsedeceğiz.

Resim 1. String vs StringBuilder vs StringBuffer

String Nedir?

String her şeyden önce bir sınıftır. En basit tanımıyla char dizilerini temsil eder diyebiliriz. String ilkel bir veri tipi değildir. Bir class’tır ve kendine ait özellikler barındırmaktadır. Konumuz şu an bu olmadığından başka bir yazıda buna değinebiliriz.https://medium.com/media/dd6682bed549699bd2a5df477430ec79

Konumuzla ilgili bir String özelliğinden bahsetmek gerekirse, String’ler immutable’dır. Yani değiştirilemez. Şöyle bir soru sorabilirsiniz: “Ama ben bir String değişken yapıp sonrasında yeni değer ataması yapabiliyorum. O nasıl oluyor?”. Burada yapılan şey aslında var olan String değişkeni değerini değiştirmek olmuyor. Hafızada yeni bir alan açılıyor ve String değişkenimiz artık o alanı göstermiş oluyor. Değişken her güncellendiğinde hafızadan yeni bir alan açılmış oluyor.

Resim 2. String hafıza kullanımı

Size bankalardan gelen e-mail’leri düşünün. Bir tasarımları var ve içerisinde de size ait oluşturulmuş bir metin var. Bu işlemi yapmak için html kullanarak template oluşturuluyor. İçerisindeki metin için de gerekli yerlerden değişken değerleri bulunup paragraf hazırlanıyor. Bu hazırlanan mail içeriğinin bir String değişkeni olduğunu düşünün. Önce html template’ini hazırladınız ve değişkeninize atadınız. Hafızadan bir alan açıldı. Sonra gerekli modüllerden değişkenlerinizi toplayıp paragraf hazırladınız ve aynı String değişkeni içerisine yerleştirdiniz. Tekrar hafızadan yeni bir alan açıldı. Başka bir modülden bir değer daha aldınız tekrar değişkeninizi güncellediniz. Derken hafızada oluşturulan gereksiz alanlar artmaya başladı.

Başka ve daha net anlaşılır bir örnek vermek gerekirse; bir String değişkenimiz olduğunu düşünün. Belli işlemler yapıyoruz ve her seferinde sonuna + ile elde ettiğimiz diğer verileri ekliyoruz. Yaptığımız bu her + işleminde hafızada yeni bir alan açılmış oluyor. Bu bizim için hem performans kaybı hem de zaman kaybına neden oluyor.

Bu durumda bize yardımcı olacak 2 class mevcut. StringBuilder ve StringBuffer.

StringBuilder Nedir?

StringBuilder sınıfı en kısa tanımla bize “mutable” yani değiştirilebilir string elde etmemize olanak tanır. Böylece hafızada her seferinde yeni bir alan açılmadan var olan alan üzerinde değişiklik yapılabilir. Bu da StringBuilder sınıfını hafıza kullanımı olarak String sınıfının önüne geçirir.

StringBuilder thread-safe değildir. Yani synchronized değildir. Thread’li bir işlem kullanılacaksa StringBuilder kullanılması güvenli değildir. Basit bir şekilde durumu açıklayacak olursak: Aynı anda birden fazla thread, oluşturduğunuz StringBuilder nesnesini değiştirmeye çalıştığında StringBuilder bunu engelleyemez. Bu durumda da threadler arasında yapılan değişiklikler aslında bizim istemediğimiz değer değişikliğine neden olur.

Bir mail göndermek için StringBuilder ile metin oluşturduğunuzu düşünün. Bu işlemi de aynı zamanda 2 farklı thread çalıştırıyor olsun. İlk thread işlemine başlayıp StringBuilder nesnenizi değiştiriyor ve mail içeriğini ayarlıyor. Aynı zamanda diğer thread de aynı StringBuilder nesnesi üzerinde değişiklik yapmak istiyor. Farklı bir kişiye gönderilecek mail için içerik hazırlıyor. Ancak bunu yaparken ilk thread’imizin atadığı değeri ezmiş oluyor. Bunun önüne geçmek için StringBuffer kullanılmalıdır.

StringBuffer Nedir?

StringBuffer ile StringBuilder aynı metodlara sahiptir. Aynı mantıkla ilerler. Aralarındaki tek fark ise StringBuffer thread-safe yani synchronized ‘tır. Bu durum da StringBuffer’ı thread’li işlemlerde kullanılmasını güvenli yapar. Thread’li işlemlerde güvenli olmasının getirdiği bir dezavantaj da mevcuttur. Bu durum StringBuffer’ın StringBuilder’dan daha yavaş çalışmasına neden olur.

kaynak: medium.com