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:
- EN
String
objekt på plassering 0 - EN
StringBuffer
objekt på plassering 10 - 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, StringBuffer
s 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
.
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.