16 Ocak 2015 Cuma

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

 






































StringStringBufferStringBuilder
Depolama AlanıSabit uygulama havuzuHeapHeap
DeğiştirilebilirHayır (Değişmez)Evet(değişir)Evet(değişir)
Thread GüvenliğiEvetEvetHayır
PerformansHızlıÇok yavaşHızlı

 

Hiç yorum yok:

Yorum Gönder