Programmering

StringBuffer versus String

Java leverer StringBuffer og Snor klasser og Snor klasse bruges til at manipulere tegnstrenge, der ikke kan ændres. Enkelt sagt, objekter af typen Snor er læselige og uforanderlige. Det StringBuffer klasse bruges til at repræsentere tegn, der kan ændres.

Den signifikante præstationsforskel mellem disse to klasser er den StringBuffer er hurtigere end Snor når du udfører enkle sammenkædninger. I Snor manipulationskode, sammenkobles karakterstrenge rutinemæssigt. Bruger Snor klasse udføres sammenkædninger typisk som følger:

 Strengstr = ny streng ("Stanford"); str + = "Mistet !!"; 

Hvis du skulle bruge StringBuffer for at udføre den samme sammenkædning skal du bruge kode, der ser sådan ud:

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

Udviklere antager normalt, at det første eksempel ovenfor er mere effektivt, fordi de mener, at det andet eksempel, der bruger Tilføj metode til sammenkædning er dyrere end det første eksempel, der bruger + operatør til sammenkædning af to Snor genstande.

Det + operatøren ser uskyldig ud, men den genererede kode giver nogle overraskelser. Brug af en StringBuffer til sammenkædning kan faktisk producere kode, der er betydeligt hurtigere end at bruge en Snor. For at finde ud af hvorfor dette er tilfældet, skal vi undersøge den genererede bytecode ud fra vores to eksempler. Bytekoden for eksemplet ved hjælp af Snor ser sådan ud:

0 nyt # 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å steder 0 til 9 udføres for den første linje kode, nemlig:

 Strengstr = ny streng ("Stanford"); 

Derefter udføres bytekoden på placering 10 til 29 til sammenkædningen:

 str + = "Mistet !!"; 

Ting bliver interessante her. Den bytecode, der genereres til sammenkædningen, opretter en StringBuffer objekt, derefter påberåber det sig Tilføj metode: den midlertidige StringBuffer objekt oprettes på placering 10, og dens Tilføj metode kaldes på sted 23. Fordi Snor klasse er uforanderlig, a StringBuffer skal bruges til sammenkædning.

Efter sammenkædningen er udført på StringBuffer objekt, skal det konverteres tilbage til et Snor. Dette gøres med opkaldet til toString metode på placering 26. Denne metode skaber en ny Snor objekt fra det midlertidige StringBuffer objekt. Oprettelsen af ​​denne midlertidige StringBuffer objekt og dets efterfølgende konvertering tilbage til en Snor objekt er meget dyre.

Sammenfattende resulterer de to kodelinjer ovenfor i oprettelsen af ​​tre objekter:

  1. EN Snor objekt på sted 0
  2. EN StringBuffer objekt på sted 10
  3. EN Snor objekt på sted 26

Lad os nu se på bytekoden genereret til eksemplet ved hjælp af 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å steder 0 til 9 udføres for den første linje kode:

 StringBuffer str = ny StringBuffer ("Stanford"); 

Bytekoden på placering 10 til 16 udføres derefter til sammenkædningen:

 str.append ("Lost !!"); 

Bemærk, at denne kode, som det er tilfældet i det første eksempel, påkalder Tilføj metode til en StringBuffer objekt. I modsætning til det første eksempel er der imidlertid ikke behov for at oprette en midlertidig StringBuffer og konverter det derefter til en Snor objekt. Denne kode skaber kun et objekt, StringBuffer, på placering 0.

Afslutningsvis, StringBuffer sammenkædning er betydeligt hurtigere end Snor sammenkædning. Naturligvis, StringBuffers bør anvendes i denne type operationer, når det er muligt. Hvis funktionaliteten af Snor klasse ønskes, overvej at bruge en StringBuffer til sammenkædning og derefter udføre en konvertering til Snor.

Reggie Hutcherson er en Sun-teknologi-evangelist. Han evangeliserer Suns Java 2 Platform-teknologier rundt om i verden og koncentrerer sig om J2SE og HotSpot-præstationsmotoren.

Lær mere om dette emne

  • "JavaWorld debuterer den nye ugentlige Java-præstationskolonne, "Reggie Hutcherson (JavaWorld, Marts 2000)

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

  • "Grundlæggende om Java-ydeevne," Reggie Hutcherson (JavaWorld, Marts 2000)

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

  • "Ydeevneproblem eller designproblem?" Reggie Hutcherson (JavaWorld, Marts 2000)

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

  • "Compileroptimeringer", Reggie Hutcherson (JavaWorld, Marts 2000)

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

Denne historie, "StringBuffer versus String" blev oprindeligt udgivet af JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found