StringBuffer ve String

Java, StringBufferve Stringsınıflarını sağlar ve sınıf, Stringdeğiştirilemeyen karakter dizilerini işlemek için kullanılır. Basitçe ifade etmek gerekirse, türdeki nesneler Stringsalt okunurdur ve değişmezdir. StringBufferSınıf değiştirilebilir karakteri göstermek için kullanılır.

Bu iki sınıf arasındaki önemli performans farkı StringBuffer, Stringbasit birleştirme gerçekleştirirken olduğundan daha hızlı olmasıdır . In Stringmanipülasyon kodu, karakter dizeleri rutin birleştirilmiş. StringSınıfı kullanarak , birleştirmeler genellikle şu şekilde gerçekleştirilir:

String str = new String ("Stanford"); str + = "Kayıp !!";

StringBufferAynı birleştirmeyi gerçekleştirmek için kullanacak olsaydınız, şuna benzer bir koda ihtiyacınız olurdu:

StringBuffer str = new StringBuffer ("Stanford"); str.append ("Kayıp !!");

Geliştiriciler genellikle yukarıdaki ilk örneğin daha verimli olduğunu varsayarlar çünkü appendbirleştirme yöntemini kullanan ikinci örneğin, +iki Stringnesneyi birleştirmek için operatörü kullanan ilk örnekten daha maliyetli olduğunu düşünürler .

+Operatör masum görünür, ancak üretilen kod bazı sürprizler üretir. StringBufferBirleştirme için kullanmak , aslında bir String. Bunun neden böyle olduğunu keşfetmek için, üretilen bayt kodunu iki örneğimizden incelemeliyiz. Kullanan örnek için bayt kodu Stringşuna benzer:

0 new # 7 3 dup 4 ldc # 2 6 invokepecial # 12 9 astore_1 10 new # 8 13 dup 14 aload_1 15 invokestatic # 23 18 invokepecial # 13 21 ldc # 1 23 invokevirtual # 15 26 invokevirtual # 22 29 astore_1 

0'dan 9'a kadar konumlardaki bayt kodu, ilk kod satırı için yürütülür, yani:

 String str = new String ("Stanford"); 

Ardından, 10'dan 29'a kadar olan konumdaki bayt kodu birleştirme için yürütülür:

 str + = "Kayıp !!"; 

Burada işler ilginçleşiyor. Birleştirme için üretilen bayt kodu bir StringBuffernesne yaratır , ardından appendyöntemini çağırır : geçici StringBuffernesne konum 10'da oluşturulur ve appendyöntemi konum 23'te çağrılır. StringSınıf değişmez olduğundan, StringBufferbirleştirme için a kullanılmalıdır.

StringBufferNesne üzerinde birleştirme gerçekleştirildikten sonra, nesnenin bir String. Bu, toStringkonum 26'daki yönteme çağrı ile yapılır . Bu yöntem String, geçici StringBuffernesneden yeni bir nesne oluşturur . Bu geçici StringBuffernesnenin yaratılması ve daha sonra bir Stringnesneye dönüştürülmesi çok pahalıdır.

Özetle, yukarıdaki iki satır kod, üç nesnenin oluşturulmasıyla sonuçlanır:

  1. String0 konumunda bir nesne
  2. StringBuffer10. konumdaki bir nesne
  3. String26. konumdaki bir nesne

Şimdi, örnek için oluşturulan bayt koduna bakalım StringBuffer:

0 yeni # 8 3 dup 4 ldc # 2 6 özel # 13 9 astore_1 10 aload_1 11 ldc # 1 13 invokevirtual # 15 16 pop 

0'dan 9'a kadar konumlardaki bayt kodu, kodun ilk satırı için yürütülür:

 StringBuffer str = new StringBuffer ("Stanford"); 

10'dan 16'ya kadar olan konumdaki bayt kodu daha sonra birleştirme için yürütülür:

 str.append ("Kayıp !!"); 

İlk örnekte olduğu gibi, bu kodun appendbir StringBuffernesnenin yöntemini çağırdığına dikkat edin . Bununla birlikte, ilk örnekten farklı olarak, bir geçici oluşturup StringBuffersonra onu bir Stringnesneye dönüştürmeye gerek yoktur . Bu kod, 0 konumunda yalnızca bir nesne oluşturur StringBuffer.

Sonuç olarak, StringBufferbirleştirme , birleştirmeden önemli ölçüde daha hızlıdır String. Açıkçası, StringBufferbu tür işlemlerde mümkün olduğunda kullanılmalıdır. StringSınıfın işlevselliği isteniyorsa, StringBufferbirleştirme için bir kullanmayı ve ardından öğesine bir dönüştürme gerçekleştirmeyi düşünün String.

Reggie Hutcherson, bir Sun teknoloji müjdecisidir. J2SE ve HotSpot performans motoruna yoğunlaşarak dünya çapında Sun'ın Java 2 Platform teknolojilerini duyurdu.

Bu konu hakkında daha fazla bilgi edinin

  • " JavaWorld, yeni haftalık Java performans sütununu piyasaya sürüyor, " Reggie Hutcherson ( JavaWorld, Mart 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf.html

  • "Java performansının temelleri," Reggie Hutcherson ( JavaWorld, Mart 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html

  • "Performans sorunu mu, tasarım sorunu mu?" Reggie Hutcherson ( JavaWorld, Mart 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html

  • "Derleyici optimizasyonları", Reggie Hutcherson ( JavaWorld, Mart 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html

"StringBuffer versus String" adlı bu hikaye, ilk olarak JavaWorld tarafından yayınlandı.