Java pruža StringBuffer
i String
klase, a String
klasa se koristi za manipulaciju znakovnih nizova koji se ne može mijenjati. Jednostavno rečeno, objekti tipa String
su samo za čitanje i nepromjenjivi. StringBuffer
Klasa se koristi za predstavljanje znakova koji se mogu mijenjati.
Značajna razlika u izvedbi između ove dvije klase StringBuffer
je brža nego String
kod izvođenja jednostavnih spajanja. U String
manipulacijskom kodu nizovi znakova rutinski se spajaju. Koristeći String
klasu, spajanja se obično izvode na sljedeći način:
String str = new String ("Stanford"); str + = "Izgubljeno !!";
Ako biste koristili StringBuffer
za izvođenje istog spajanja, trebao bi vam kôd koji izgleda ovako:
StringBuffer str = novi StringBuffer ("Stanford"); str.append ("Izgubljeno !!");
Programeri obično pretpostavljaju da je prvi gornji primjer učinkovitiji jer misle da je drugi primjer, koji koristi append
metodu za spajanje, skuplji od prvog primjera, koji koristi +
operatora za spajanje dvaju String
objekata.
Čini se da je +
operater nevin, ali generirani kod stvara neka iznenađenja. Korištenje StringBuffer
for za spajanje zapravo može proizvesti kod koji je znatno brži od korištenja a String
. Da bismo otkrili zašto je to slučaj, moramo ispitati generirani bytecode iz naša dva primjera. Bajtkod za primjer koji se koristi String
izgleda ovako:
0 novo # 7 3 dup 4 ldc # 2 6 invokespecial # 12 9 astore_1 10 novo # 8 13 dup 14 aload_1 15 invokestatic # 23 18 invokespecial # 13 21 ldc # 1 23 invokevirtual # 15 26 invokevirtual # 22 29 astore_1
Bytecode na mjestima od 0 do 9 izvršava se za prvi redak koda, i to:
String str = new String ("Stanford");
Zatim se za spajanje izvršava bytecode na mjestu 10 do 29:
str + = "Izgubljeno !!";
Stvari ovdje postaju zanimljive. Bytecode generiran za spajanje stvara StringBuffer
objekt, a zatim poziva njegovu append
metodu: privremeni StringBuffer
objekt kreira se na mjestu 10, a append
metoda se zove na mjestu 23. Budući da je String
klasa nepromjenjiva, StringBuffer
za spajanje se mora koristiti.
Nakon izvršenja spajanja na StringBuffer
objektu, mora se pretvoriti natrag u String
. To se postiže pozivom toString
metode na mjestu 26. Ova metoda stvara novi String
objekt od privremenog StringBuffer
objekta. Stvaranje ovog privremenog StringBuffer
objekta i njegovo naknadno pretvaranje natrag u String
objekt vrlo su skupi.
Ukratko, gornja dva retka koda rezultiraju stvaranjem tri objekta:
String
Objekt na lokaciji 0StringBuffer
Objekt na lokaciji 10String
Objekt na lokaciji 26
Sada, pogledajmo bajt kod generiran za primjer pomoću StringBuffer
:
0 novo # 8 3 dup 4 ldc # 2 6 invokespecial # 13 9 astore_1 10 aload_1 11 ldc # 1 13 invokevirtual # 15 16 pop
Bajtkod na mjestima od 0 do 9 izvršava se za prvi redak koda:
StringBuffer str = novi StringBuffer ("Stanford");
Zatim se izvršava bajtkod na mjestu 10 do 16 za spajanje:
str.append ("Izgubljeno !!");
Primijetite da, kao što je slučaj u prvom primjeru, ovaj kod poziva append
metodu StringBuffer
objekta. Za razliku od prvog primjera, međutim, nije potrebno stvoriti privremeni, StringBuffer
a zatim ga pretvoriti u String
objekt. Ovaj kôd stvara samo jedan objekt StringBuffer
, na mjestu 0.
Zaključno, StringBuffer
spajanje je znatno brže od String
spajanja. Očito, StringBuffer
s treba koristiti u ovoj vrsti operacije kad je to moguće. Ako String
je poželjna funkcionalnost klase, razmislite o upotrebi StringBuffer
for za spajanje, a zatim izvršite jednu pretvorbu u String
.
Saznajte više o ovoj temi
- " JavaWorld predstavio novi tjedni stupac performansi Java," Reggie Hutcherson ( JavaWorld, ožujak 2000.)
//www.javaworld.com/jw-03-2000/jw-03-javaperf.html
- "Osnove Java izvedbe", Reggie Hutcherson ( JavaWorld, ožujak 2000.)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html
- "Problem performansi ili problem dizajna?" Reggie Hutcherson ( JavaWorld, ožujak 2000.)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html
- "Optimizacije kompajlera ", Reggie Hutcherson ( JavaWorld, ožujak 2000.)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html
Ovu je priču "StringBuffer nasuprot nizu" izvorno objavio JavaWorld.