String, StringBuilder ve StringBuffer sınıfları arasındaki fark

Bu makalede  String , StringBuilder ve StringBuffer sınıfları arasındaki farkı örnekler vererek göstermeye çalışacağım. Bu sınıflar arasındaki ufak ama önemli farkları anlamaya çalışacağız.

String

String sabittir (yani yaratıldıktan sonra değiştirilemez). String olarak yaratılan bir nesne Değişmez String Havuzunda (Constant String Pool) depolanır. C# dilinde her  sabit güvenli bir nesnedir bu String nesnesinin de güvenli bir sabit olduğu anlamına gelir. String eş zamanlı iki iş parçacığı (thread ) tarafından aynı veya eş zamanda kullanılamaz. Çünkü String bir kere atandıktan sonra değiştirilemez. Burada aklınıza şu soru gelebilir.

String s1 = “abc”;
s1 += ” def”;

String atandıktan sonra değiştirilemez diyorsunuz ama yukarıda ki şekilde bir kullanım yaptığımda String değişiyor. Bu dediğiniz nasıl oluyor?

Yerinde bir soru… Fakat String üzerinde her değişiklik yapıldığında yeni bir string oluşturulacaktır.

s1 += ” def”; ifadesi hafızada yeni bir alan açacak ve atama işlemini bu alanda gerçekleştirecektir.

String  demo = ” Merhaba dünya” ;//Yukarıdaki nesne değişmez string havuzunda depolanır ve değeri değiştirilemez.

demo=”Kapat” ;

//”Kapat” string  değeri için değişmez string havuzunda yeni bir string yaratıldı

//”Merhaba dünya” string değeri hala değişmez uygulama havuzunda duruyor ve değeri değişmedi yada bu değerin üstüne yazılmadı fakat  “Merhaba dünya” stringinin referansını kullanamıyoruz.

StringBuffer

StringBuffer sabit değildir yani nesnenin değeri değiştirilebilir. StringBuffer üzerinden yaratılan bir nesne belleğin heap bölgesinde depolanır. StringBuffer’lar aslında StringBuilderl’larla aynı metotlardır fakat güvenli olan StringBuffer parçacığı  içerisindeki her StringBuffer metot senkronize edilmiştir. 

Bundan dolayı aynı anda iki thread’in aynı metoda erişmesine izin verilmez. Her metoda bir thread tarafından bir kere erişilebilir.

Fakat bu özellik yani güvenli thread özelliği StringBuffer’ın performansı açısından bir çok dezavantaj yaratıyor. Bundan dolayı sınıflardan aynı metodlar çağrıldığıdan StringBuilder StringBuffer’dan daha hızlı çalışıyor.

StringBuffer değeri değiştirilebilir yani yeni bir değer atanabilir. En çok merak edilen soru”yukarıda bahsedilen sınıflar arasındaki farklar nelerdir ?” sorusudur. StringBuffer toString() metodu kullanılarak string türüne dönüştürülebilir.

StringBuffer demo1 = new StringBuffer(“Merhaba”) ;
// Yukarıdaki nesne heap bölgesinde depolanır ve değeri değiştirilebilir.

demo1=new StringBuffer(“Güle güle”);
//StringBuffer değer değişikliğine izin verdiği için yukarıdaki ifade doğrudur

StrinBuilder

StringBuilder heap bölgesinde depolanması ve değiştirilebilir olması bakımından  StringBuffer ile neredeyse  aynıdır. Bu ikiliyi birbirinden ayıran temel fark StringBuilder thread güveliği özelliğine sahip değildir.
StringBuilder hızlı olduğu gibi thread güvenliği özelliğine sahip değildir.

StringBuilder demo2= new StringBuilder(“Merhaba”);
// Yukarıdaki nesne heap bölgesinde depolanır ve değeri değiştirilebilir.
demo2=new StringBuilder(“Güle güle”);
//StringBuilder değer değişikliğine izin verdiği için yukarıdaki ifade doğrudur

 

String StringBuffer StringBuilder
Depolama Alanı Sabit uygulama havuzu Heap Heap
Değiştirilebilir Hayır (Değişmez) Evet(değişir) Evet(değişir)
Thread Güvenliği Evet Evet Hayır
Performans Hızlı Çok yavaş Hızlı

 

Muavenet

Web teknolojilerine merak salmış bir bilgisayar mühendisinin yazıları

String, StringBuilder ve StringBuffer sınıfları arasındaki fark” hakkında 1 yorum

Bir cevap yazın

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