Pure Java – 55 StringBuffer & StringBuilder

Merhaba Arkadaslar,
Bu yazimda java.lang.StringBuffer ve java.lang.StringBuilder siniflarinda bahsedecegim. Onceki yazilardan hatirlayacagimiz gibi String objeleri immutable ozellige sahipti. String objeleri ile cok fazla degisiklik yapmamiz(manipulation) sonucunda yeni objeler olusacaktir ve bu olusan objelerin buyuk bir kismi String Poolda terkedilmis objeler olarak kalacaktir.(yani referans gosteren bir degiskeni olmayacaktir).

String objeleri uzerinden cok fazla degisiklik yapilacagi zaman String sinifini kullanmak yerine StringBuffer veya StringBuilder siniflarini kullanmak verimlilik saglayacaktir. StringBuffer ve StringBuilder objeleri immutable degildir dolayisiyla bu objeler uzerinde degisiklik yapilabilir.

StringBuffer vs StringBuilder
StrinBuffer ve StringBuilder ayni metotlara sahiptir . Bu siniflar arasindaki fark sudur ; StringBuilder thread-safe degildir yani StringBuilder sinifinin metotlari syncronized degildir. Dolayisiyla StringBuilder , StringBuffer sinifa gore daha hizli calisacaktir.

StringBuffer & StringBuilder vs String
String’in immutable ozelligini incelemistik , ornegin ;

		String x = "abc";
		x.concat("def");
		System.out.println("x = " + x); // cikti x = abc olacaktir

Hatirlayacagimiz gibi bu kod orneginde ;
1) “abc” objesi olustu ve x referans degiskeni bu objeyi gostermekte.
2) “def” objesi olustu fakat terkedilmis durumda (abadoned)
3) concat metodu sonucu “abcdef” objesi olustu fakat burada x degiskenine assign(atama) yapilmadigi icin bu “abcdef” objesi de terkedilmis durumdadir(abandoned)

Biz sadece 1 tek objeyi referans gostermekteyiz fakat terkedilmis olarak 2 tane obje var bu verimli bir durum degildir.(wasting memory)

Simdi benzer durumu StringBuffer icin yapalim. (StringBuilder da olur)

		
		StringBuffer sb = new StringBuffer("abc");
		sb.append("def");
		System.out.println("sb = " + sb); //cikti sb = abcdef olacaktir

Burada “abc” degerine sahip StringBuffer objesi olustu , append metodu sonrasinda ilgili metodumuz “abcdef” degerine sahip oldu. Burada String orneginde oldugu gibi ne “def” degerine sahip obje olustu ne de yeni bir “abcdef” objesi olustu. Sadece 1 objemiz var bu objemizi modifiye ettik !

StringBuffer & StringBuilder sinifi metotlari

append metodu
append metodunun bir cok overloaded hali bulunmaktadir. Yukarida bahsettigim gibi StringBuffer sinifi thread-safe’tir dolayisiyla metotlari synchronized’dir. Ornek bir append metodu;

 
public synchronized StringBuffer append(String str) {...}

append metodu, ilgili StringBuffer ya da StringBuilder objesinin degerine ekleme yapacaktir.

public class AppendTest {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("levent");
		sb.append(" erguder ");
		sb.append(1989);

		System.out.println(sb);
	}
}

delete metodu

    public synchronized StringBuffer delete(int start, int end) { ... }

delete metodu, StringBuffer veya StringBuilder’in degerini (start-end] araliginda silecektir.

public class DeleteTest {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder("0123456789");
		sb.delete(4, 6);
		// index 0 dan baslayacaktir!
		// baslangic indexi dahil,(4)
		// bitis indexi dahil degildir (6)
		
		System.out.println(sb);
	}
}

insert metodu
insert metodunun da append metodu gibi bir cok overloaded hali mevcuttur. append metodu ilgili StringBuilder/StringBuffer’in sonuna ekliyordu, insert metodu yardimi ile diledigimiz index alanindan itibaren bu ekleme islemini yapabiliriz.

   public StringBuffer insert(int offset, int i) { ... }
public class InsertTest {

	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder("0123456789");
		sb.insert(4, "----"); // 4.indexten sonra ekleme yap!(insert)
		System.out.println(sb);

	}
}

reverse metodu
reverse metodu , StringBuffer/StringBuilder objesinin degerini ters cevirir. Belki bir yerde isimize yarar =)

     public synchronized StringBuffer reverse() {...}
public class ReverseTest {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("levent erguder");
		sb.reverse();
		System.out.println(sb);
	}
}

toString metodu
toString metodu ile StringBuffer ve StringBuffer objesinden String obje olustururuz.

 
 public synchronized String toString() {.. }
public class ToStringTest {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("test string");
		System.out.println(sb.toString());
	}
}

StringBuffer/StringBuilder siniflari , String sinifindaki tanimli metotlarla ayni metotlara da sahiptir.

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

 

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *