StringBuffer kontra String

Java ger StringBufferoch Stringklasser, och Stringklassen används för att manipulera teckensträngar som inte kan ändras. Enkelt uttryckt är föremål av typen Stringskrivskyddade och oföränderliga. Den StringBufferklassen används för att representera tecken som kan ändras.

Den signifikanta prestandaskillnaden mellan dessa två klasser är att det StringBufferär snabbare än Stringnär man utför enkla sammankopplingar. I Stringmanipulationskod sammanfogas teckensträngar rutinmässigt. Med hjälp av Stringklassen utförs sammanfogningar vanligtvis enligt följande:

Strängstr = ny sträng ("Stanford"); str + = "Lost !!";

Om du skulle använda för StringBufferatt utföra samma sammankoppling behöver du kod som ser ut så här:

StringBuffer str = new StringBuffer ("Stanford"); str.append ("Lost !!");

Utvecklare antar vanligtvis att det första exemplet ovan är effektivare eftersom de tror att det andra exemplet, som använder appendmetoden för sammankörning, är dyrare än det första exemplet, som använder +operatören för att sammanknappa två Stringobjekt.

Den +operatör verkar oskyldig, men koden som genereras producerar några överraskningar. Att använda en StringBufferför sammanfogning kan faktiskt producera kod som är betydligt snabbare än att använda en String. För att upptäcka varför så är fallet måste vi undersöka den genererade bytkoden från våra två exempel. Bytkoden för exemplet med Stringser ut så här:

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

Bytekoden på platserna 0 till 9 körs för den första kodraden, nämligen:

 Strängstr = ny sträng ("Stanford"); 

Därefter körs bytekoden på plats 10 till 29 för sammankopplingen:

 str + = "Lost !!"; 

Saker blir intressanta här. Bytkoden som genereras för sammankopplingen skapar ett StringBufferobjekt och anropar sedan dess appendmetod: det tillfälliga StringBufferobjektet skapas på plats 10 och dess appendmetod kallas på plats 23. Eftersom Stringklassen är oföränderlig, StringBuffermåste ett användas för sammankoppling.

Efter att sammankopplingen har utförts på StringBufferobjektet måste den konverteras tillbaka till en String. Detta görs med anropet till toStringmetoden på plats 26. Denna metod skapar ett nytt Stringobjekt från det tillfälliga StringBufferobjektet. Skapandet av detta tillfälliga StringBufferobjekt och dess efterföljande omvandling till ett Stringobjekt är mycket dyrt.

Sammanfattningsvis resulterar de två kodraderna ovan i skapandet av tre objekt:

  1. Ett Stringobjekt på plats 0
  2. Ett StringBufferobjekt på plats 10
  3. Ett Stringobjekt på plats 26

Låt oss nu titta på bytekoden som genereras för exemplet med StringBuffer:

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

Bytekoden på platserna 0 till 9 körs för den första raden kod:

 StringBuffer str = new StringBuffer ("Stanford"); 

Bytekoden på plats 10 till 16 körs sedan för sammanfogningen:

 str.append ("Lost !!"); 

Observera att den här koden, som är fallet i det första exemplet, åberopar appendmetoden för ett StringBufferobjekt. Till skillnad från det första exemplet finns det dock inget behov av att skapa en tillfällig StringBufferoch sedan konvertera den till ett Stringobjekt. Den här koden skapar bara ett objekt StringBuffer, på plats 0.

Sammanfattningsvis är StringBuffersammankoppling betydligt snabbare än Stringsammanfogning. Uppenbarligen StringBufferbör s användas i denna typ av operation när det är möjligt. Om Stringklassens funktionalitet önskas, överväg att använda a StringBufferför sammanfogning och sedan utföra en konvertering till String.

Reggie Hutcherson är en evangelist från Sun-teknologin. Han evangeliserar Suns Java 2-plattformsteknologier runt om i världen och koncentrerar sig på J2SE och HotSpot-prestandamotorn.

Läs mer om detta ämne

  • " JavaWorld debuterar ny Java-prestandakolumn varje vecka", Reggie Hutcherson ( JavaWorld, mars 2000)

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

  • "Grunderna i Java-prestanda", Reggie Hutcherson ( JavaWorld, mars 2000)

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

  • "Prestandaproblem eller designproblem?" Reggie Hutcherson ( JavaWorld, mars 2000)

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

  • "Kompilatoroptimeringar", Reggie Hutcherson ( JavaWorld, mars 2000)

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

Denna berättelse, "StringBuffer versus String" publicerades ursprungligen av JavaWorld.