folder Tahribat.com Forumları
linefolder Java
linefolder String Vs Stringbuffer



String Vs Stringbuffer

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DuPi
    DuPi's avatar
    Kayıt Tarihi: 21/Ağustos/2005
    Erkek

    Merhaba Beyler,

    Geçen kitap okurken anlatılıyordu. test edince gördüm ki StringBuffer String'e her türlü basıyor.

    Anlamadığım ikiside nesne olarak oluşturuluyor. fakat biri diğerine uçurum fark açıyor. çalışma yapısından kaynaklı deyip geçmeyin. biraz işin iç yüzünü anlatın bilen arkadaşlar.

     

     

    //kod başı

    package reklamyok.StringBufferTest;
    
    public class StringBufferTest {
    	public short BUFFLEN = 16;
    	public int ITERATOR = 10000;
    	static StringBufferTest st = new StringBufferTest();
    	public void stringSinifi()
    	{
    		System.out.println("String Sınıfı Yazar");
    		String str = new String("0");
    		long start = System.currentTimeMillis();
    		for(int i=0;i<ITERATOR;i++)
    		{
    	    str +=i % 10;		
    		}
    		long end = System.currentTimeMillis();
    		System.out.println("Length : "+st.BUFFLEN);
    		System.out.println("Time : "+(end-start));
    	}
    	public void stringbufferSinifi()
    	{
    		System.out.println("StringBuffer Sınıfı Yazar");
    		StringBuffer str = new StringBuffer(BUFFLEN);
    		long start = System.currentTimeMillis();
    		for(int i=0;i<ITERATOR;i++)
    		{
    	    str.append(i % 10);		
    		}
    		long end = System.currentTimeMillis();
    		System.out.println("Length : "+st.BUFFLEN);
    		System.out.println("Time : "+(end-start));
    		
    	}
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
           st.stringSinifi();
           st.stringbufferSinifi();
    	}
    
    }

     

    //kod sonu

    ÇIKTI :

    String Sınıfı Yazar
    Length : 16
    Time : 113
    StringBuffer Sınıfı Yazar
    Length : 16
    Time : 4

     


    Ne zaman birşey öğrenmek istesem, Birden Vaktim Kalmıyor ?
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    mugen
    mugen's avatar
    Kayıt Tarihi: 22/Haziran/2013
    Erkek

    hız farkının olmasının sebebi sanırım string "sabit string havuzu (Constant String Pool)" olarak adlandırılan bir yerde tutulurken, stringbuffer'ın direkt yığında tutuluyor olması, ama baktığım yerdeki string testi stringbuffer'a oranla daha hızlı çıkmış, bir de stringBuilder diye bir şey varmış hocam.

    http://www.thejavageek.com/2013/06/19/the-string-constant-pool/

    http://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html

     

    mugen tarafından 06/Eyl/15 01:37 tarihinde düzenlenmiştir

    O mahiler ki derya içredir deryayı bilmezler.. .
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    S2kucuk
    S2kucuk's avatar
    Banlanmış Üye
    Kayıt Tarihi: 06/Haziran/2015
    Erkek

    String e append yaptığın her sefer için yeni bir String objesi oluşur, eskisiyle beraber yeni değer de beraberinde kopyalanır. 1000 tane append yaparsan, 999 tane String nesnesi garbage'a düşmek için memory'ni çöplüğe çevirir. Yani String immutable bir nesne türüdür. Ama stringbuffer adı üzerinde belli bir bufferdan oluştur. Append yapmak için nesneyi yeni nesneye kopyalamazsın. Nesne adedi 1dir. Yani mutable nesne türü. Ama kalkıp o zaman string'i kimse kullanmasın, herkes stringbuffer kullansın deme sakın. Her tatlı yemenin acı osuruğu olur. Stringbuffer memoryde daha çok yer işgal eder. O yüzden heryere stringbuffer kullanayım gibi bir düşünceye girme. Gerekli şeyi gerekli yerde kullanmalısın. Ayrıca stringbuffer thread-safe ve syncronised metodlardan oluşur, yani multi-thread uygulamalarda güvenle kullanabilirsin ama tabi buda lock mekanizması içerdiği için tekrardan performanstan ödün verecektir. Hadi az daha kafanı bulandırayım, Stringbuilder diye de bişi var buda stringbuffer'ın 1e1 kopyası ama thread-safe olmayan versiyonu. Threadlerle işim olmayacak dersen alternatifin olabilir. 

    Edit: Toparlamak için performans sırası vereyim;

    String > StringBuilder > StringBuffer

     

    S2kucuk tarafından 06/Eyl/15 01:43 tarihinde düzenlenmiştir
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    buradaki eleman açıklamış hocam http://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html

    ancak senin sonuçta terslik var, bakmak lazım. çünkü stringbuilder de bakıldığında yazıya göre synchronized olarak işaretlenmiş..

    şimdi bir metod ya da değişken synchronized/atomic olarak işaretleniyorsa, bu o değişkenin her an değişebileceğini bildiriyor demektir, o yüzden performansı düşürmesi gerekiyor.

    Bir başka etken de thread safe olayı var. Burda da temel olarak lock ya da türevleri kullanılmıştır. Bu da aynı anda iki threadin erişememesi anlamına geliyordur, ayrıca RC (race condition)  oluşmuyor.. 

    Bunlar aslında çok önemli konular.. Ben java da uzman olmadığım için o kadar çok derine inmedim ama bunlar hakkında bilgim var, java da asenkron programlama dersi almıştım ve hoca da gayet iyiydi, ingilizcen yeterliyse kitabı paylaşabilirim.. güzel konular, özellikle çeşitli türlerdeki locklar (cas (compare-and-swap), reentrantlock,ccas (Conditional cas)), sync-atomic, volatile olayları, can,  race condition v.s. v.s. 

     


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    NmC
    NmC's avatar
    Kayıt Tarihi: 23/Kasım/2008
    Erkek

    Hocam string normalde append tarzı işlem için uygun birşey değil. Sen ekleme yaptığında önce bi stringbuffer objesi oluşturuyor orda eklemeyi yapıyor. Daha sonra yeni stringi döndürüyor.

    Aslında zaten biri diğerini içinde kullanıyor yani :)

    İngilizcen iyi ise burda daha ayrıntılı byte code üzerinden anlatımı var. http://www.javaworld.com/article/2076072/build-ci-sdlc/stringbuffer-versus-string.html

    Ayrıca tahminim, stringbuffer olması gereken yerden fazla allocation yapıp kopyalamayı içerisine direkt yapıyor olabilir. C++ vektör yapısı benzer bir şekilde çalışıyor. Her yeni eleman eklendiğinde birer birer allocation yapmak yerine performans için toplu olarak yapılıyor allocation işlemleri.


    There are 10 types of people in the world. Those who knows binary and those who dont...