StringBuffer naspram Stringa

Java pruža StringBufferi Stringklase, a Stringklasa se koristi za manipulaciju znakovnih nizova koji se ne može mijenjati. Jednostavno rečeno, objekti tipa Stringsu samo za čitanje i nepromjenjivi. StringBufferKlasa se koristi za predstavljanje znakova koji se mogu mijenjati.

Značajna razlika u izvedbi između ove dvije klase StringBufferje brža nego Stringkod izvođenja jednostavnih spajanja. U Stringmanipulacijskom kodu nizovi znakova rutinski se spajaju. Koristeći Stringklasu, spajanja se obično izvode na sljedeći način:

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

Ako biste koristili StringBufferza 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 appendmetodu za spajanje, skuplji od prvog primjera, koji koristi +operatora za spajanje dvaju Stringobjekata.

Čini se da je +operater nevin, ali generirani kod stvara neka iznenađenja. Korištenje StringBufferfor 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 Stringizgleda 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 StringBufferobjekt, a zatim poziva njegovu appendmetodu: privremeni StringBufferobjekt kreira se na mjestu 10, a appendmetoda se zove na mjestu 23. Budući da je Stringklasa nepromjenjiva, StringBufferza spajanje se mora koristiti.

Nakon izvršenja spajanja na StringBufferobjektu, mora se pretvoriti natrag u String. To se postiže pozivom toStringmetode na mjestu 26. Ova metoda stvara novi Stringobjekt od privremenog StringBufferobjekta. Stvaranje ovog privremenog StringBufferobjekta i njegovo naknadno pretvaranje natrag u Stringobjekt vrlo su skupi.

Ukratko, gornja dva retka koda rezultiraju stvaranjem tri objekta:

  1. StringObjekt na lokaciji 0
  2. StringBufferObjekt na lokaciji 10
  3. StringObjekt 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 appendmetodu StringBufferobjekta. Za razliku od prvog primjera, međutim, nije potrebno stvoriti privremeni, StringBuffera zatim ga pretvoriti u Stringobjekt. Ovaj kôd stvara samo jedan objekt StringBuffer, na mjestu 0.

Zaključno, StringBufferspajanje je znatno brže od Stringspajanja. Očito, StringBuffers treba koristiti u ovoj vrsti operacije kad je to moguće. Ako Stringje poželjna funkcionalnost klase, razmislite o upotrebi StringBufferfor za spajanje, a zatim izvršite jednu pretvorbu u String.

Reggie Hutcherson je evanđelist tehnologije Sun. Evangelizira Sunovu tehnologiju Java 2 Platform širom svijeta koncentrirajući se na J2SE i HotSpot engine performansi.

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.