2013-08-26 21 views
26

Bir dize oluşturucusunun salt dize birleştirme üzerinde kullanılmasının yararı nedir?Dize oluşturucu ve dize birleştirme

new StringBuilder(32).append(str1) 
        .append(" test: ") 
        .append(val) 
        .append(" is changed") 
        .toString(); 

vs

str1 + " test: " + val + " is changed". 

str1 rastgele 10 karakter dizesi olduğunu söylüyorlar. str2 rastgele bir 8 karakter dizesidir.

+0

Önemsiz örneğinizde, hiçbir yararı olmayabilir. StringBuilders kullanışlıdır, çünkü + ile uzlaştığınızda, her dolarak yepyeni dizeler yaratırsınız. StringBuilder bu nedenle çok sayıdaki dizeleri birleştirmek için daha etkilidir. –

cevap

49

Önemsiz örneğinizde, derleyici, Dize birleştirme yapmak için StringBuilder kullanıyor. Ancak, bir döngüde birleştirme gerçekleştiyse, derleyici çeşitli StringBuilder ve String nesneleri oluşturabilir. Örneğin: Yukarıdaki 3 her yürütüldüğünde, bir StringBuilder bir nesne oluşturulur

String s= "" ; 
for(int i= 0 ; i < 10 ; i++) 
    s+= "a" ; 

, s içerikleri ekli, bu "A" eklenmiş ve daha sonra StringBuilders geri atanacak bir String dönüştürülür . Toplam 10 StringBuilder s ve 10 String s.

StringBuilder sb= new StringBuilder() ; 
for(int i= 0 ; i < 10 ; i++) 
    sb.append("a"); 
String s= sb.toString() ; 

yılında Tersine

, Sadece 1 StringBuilder ve 1 String oluşturulur.

Bunun ana nedeni, derleyicinin, ilk döngünün diğerine eşdeğer olduğunu ve daha verimli (bayt) kod oluşturduğunu anlayabilecek kadar akıllı olamamasıdır. Daha karmaşık durumlarda, en akıllı derleyicinin bile bilmesi imkansızdır. Bu optimizasyona kesinlikle ihtiyacınız varsa, bunu manuel olarak StringBuilder s'yi kullanarak tanıtmanız gerekir. Eğer bunu iki dizeyi "java" oluşturmak ve edecek

String line = "java"; 
    String sufix = " is awesome"; 
    line = line + sufix; 

yazarken anlamına gelen bu değişmez dizeleri faaliyet yerli dize sınıfları kullanarak olduğunda "müthiş":

4

hızlı cevap performanstır , daha sonra iki ("java" ve "müthiş") bir üçüncü dize "java müthiş" oluşturmak daha sonra bir çöp toplayıcı tarafından silinmiş olması muhtemeldir (çünkü artık uygulamada kullanılmamaktadır). Bu yavaş bir çözümdür.

Daha hızlı çözüm, StringBuffer sınıfının, dizeleri birleştirmek için bir arabellek (bu addan açıkça anlaşılır) sağlayan ve bu nedenle birleştirme işlemi sırasında başlangıç ​​dizesini kaldırmayacak bir şekilde sağlayan akıllı algoritmalar aracılığıyla gerçekleştirilir.

Tek bir iş parçacığı uygulaması yazıyorsanız (birden fazla iş parçacığının aynı nesneye eriştiği bir uyuşmazlık sorunu yoksa), ilk StringBuffer sınıfından bile daha hızlı bir performansa sahip olan StringBuilder uygulamasının uygulanması daha iyidir.

+0

İş parçacığı güvenli veri yapıları gibi, çok iş parçacıklı yürütmede String Builder'ın bir Thread güvenli sürümünü kullanmanızı öneririz. – nmxprime