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