Programmering

StringBuffer versus String

Java tilbyr StringBuffer og String klasser, og String klasse brukes til å manipulere tegnstrenger som ikke kan endres. Enkelt sagt, objekter av typen String er skrivebeskyttet og uforanderlig. De StringBuffer klasse brukes til å representere tegn som kan endres.

Den signifikante ytelsesforskjellen mellom disse to klassene er at StringBuffer er raskere enn String når du utfører enkle sammenkoblinger. I String manipulasjonskode, sammenkobles karakterstrenger rutinemessig. Bruker String klasse, blir sammenkoblinger vanligvis utført som følger:

 String str = new String ("Stanford"); str + = "Lost !!"; 

Hvis du skulle bruke StringBuffer for å utføre den samme sammenkoblingen, trenger du kode som ser slik ut:

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

Utviklere antar vanligvis at det første eksemplet ovenfor er mer effektivt fordi de tror at det andre eksemplet, som bruker legge til metoden for sammenkjøring, er dyrere enn det første eksemplet, som bruker + operatøren for å sammenkoble to String gjenstander.

De + operatøren virker uskyldig, men den genererte koden gir noen overraskelser. Bruker en StringBuffer for sammenføyning kan faktisk produsere kode som er betydelig raskere enn å bruke en String. For å oppdage hvorfor dette er tilfelle, må vi undersøke den genererte bykoden fra våre to eksempler. Bytekoden for eksemplet ved hjelp av String ser slik ut:

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å stedene 0 til 9 utføres for den første linjen med kode, nemlig:

 String str = new String ("Stanford"); 

Deretter kjøres bytekoden på sted 10 til 29 for sammenkoblingen:

 str + = "Lost !!"; 

Ting blir interessante her. Bytekoden generert for sammenkoblingen skaper en StringBuffer gjenstand, deretter påkaller den sin legge til metode: den midlertidige StringBuffer objektet blir opprettet på sted 10, og dets legge til metoden kalles på sted 23. Fordi String klasse er uforanderlig, a StringBuffer må brukes til sammenkobling.

Etter sammenkoblingen er utført på StringBuffer objektet, må det konverteres tilbake til et String. Dette gjøres med samtalen til toString metode på sted 26. Denne metoden skaper en ny String objekt fra det midlertidige StringBuffer gjenstand. Opprettelsen av dette midlertidige StringBuffer objektet og dets påfølgende konvertering tilbake til et String objektet er veldig dyrt.

Oppsummert resulterer de to kodelinjene ovenfor i at det opprettes tre objekter:

  1. EN String objekt på plassering 0
  2. EN StringBuffer objekt på plassering 10
  3. EN String objekt på stedet 26

La oss nå se på bytekoden generert for eksemplet ved hjelp av 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å stedene 0 til 9 utføres for den første linjen med kode:

 StringBuffer str = ny StringBuffer ("Stanford"); 

Bytekoden på sted 10 til 16 utføres deretter for sammenkoblingen:

 str.append ("Lost !!"); 

Legg merke til at, som det er tilfelle i det første eksemplet, påkaller denne koden legge til metode for en StringBuffer gjenstand. I motsetning til det første eksemplet er det imidlertid ikke nødvendig å lage en midlertidig StringBuffer og deretter konvertere den til en String gjenstand. Denne koden skaper bare ett objekt, StringBuffer, på sted 0.

For å konkludere, StringBuffer sammenkobling er betydelig raskere enn String sammenkobling. Åpenbart, StringBuffers bør brukes i denne typen operasjoner når det er mulig. Hvis funksjonaliteten til String klasse er ønsket, bør du vurdere å bruke en StringBuffer for sammenkobling og deretter utføre en konvertering til String.

Reggie Hutcherson er en Sun Technology-evangelist. Han evangeliserer Suns Java 2-plattformsteknologier over hele verden og konsentrerer seg om J2SE og HotSpot-ytelsesmotoren.

Lær mer om dette emnet

  • "JavaWorld debuterer ny ukentlig Java-ytelseskolonne, "Reggie Hutcherson (JavaWorld, Mars 2000)

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

  • "Grunnleggende om Java-ytelse," Reggie Hutcherson (JavaWorld, Mars 2000)

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

  • "Ytelsesproblem eller designproblem?" Reggie Hutcherson (JavaWorld, Mars 2000)

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

  • "Kompilatoroptimaliseringer," Reggie Hutcherson (JavaWorld, Mars 2000)

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

Denne historien, "StringBuffer versus String" ble opprinnelig utgitt av JavaWorld.

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