StringBuilder ja StringBuffer
Õppevideo antud teemal:
Sissejuhatus
StringBuilder ja StringBuffer on klassid, mille eesmärk on tõhusalt üles ehitada ja muuta sõnesid.
Mõlemad on muutuvad (mutable) andmetüübid ehk nende sisu saab muuta ilma uut objekti loomata.
Mõlemad klassid on java.lang paki osa, mida ei pea eraldi nimeruumi sisse importima ja saab otse kasutada:
StringBuilder sb = new StringBuilder();
StringBuffer sbuf = new StringBuffer();
Probleem sõnedega
Javas sõned on muutumatud (immutable) objektid.
Nende sisu määratakse loomise hetkel ning neid peale seda enam muuta ei saa.
Näiliselt + operaator lubab sõnesid muuta, kuid tegelikult luuakse taustal uus sõne objekt.
Näiteks:
String text = "Hello";
text = text + " "; // Creates new String object
text = text + "World"; // Creates another new String object
text = text + "!"; // Creates yet another new String object
Üksikute muudatuste puhul see ei ole probleemiks, kuid vaatame näiteks olukorda, kus tsüklitega sõnesid üles ehitada:
String result = "";
for (int i = 0; i < 1000; i++) {
result += i + " "; // Creates 1000 new String objects!
}
Igal iteratsioonil luuakse uus sõneobjekt, mis teeb selle võtte aeglaseks ning ressursinõudlikuks.
Selle probleemi lahendamiseks on loodud StringBuilder ja StringBuffer klassid.
Need hoiavad endas ühte tähemärkide massiivi (Java 8 puhul char[], Java 9+ puhul byte[]), mida siis jooksvalt uute objektide loomise asemel muudetakse.
Selle tulemusena on sõnede üles ehitamine efektiivsem ja kasutab vähem ressursse.
Näiteks eelmine koodinäide näeks StringBuilder-it kasutades välja selline:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i).append(" "); // Modifies the same object
}
String result = sb.toString(); // Returns the builder contents as a String
StringBuilder
Keskendume selles peatükis peamiselt StringBuilder-ile.
Erinevus StringBuffer-iga on see, et viimase meetodid on sünkroniseeritud ehk on mõeldud sõnede töötlemiseks mitme lõime vahel korraga.
Meetodid on mõlemal täpselt samad.
Loomine
StringBuilder-it saab luua järgnevalt:
// Empty StringBuilder (initial capacity 16)
StringBuilder sb1 = new StringBuilder();
// With initial string
StringBuilder sb2 = new StringBuilder("Hello");
// With specific capacity
StringBuilder sb3 = new StringBuilder(100);
capacity ehk maht tähistab mitu tähemärki puhvri sisse mahub.
Kui see maht saab täis, siis seda suurendatakse automaatselt.
Põhilised meetodid
Lõppu lisamine
append() meetod lisab argumendina kaasa antud sisu olemasoleva lõppu:
StringBuilder sb = new StringBuilder("Hello"); // "Hello"
sb.append(" "); // "Hello "
sb.append("World"); // "Hello World"
sb.append("!"); // "Hello World!"
// Can chain method calls
StringBuilder sb2 = new StringBuilder();
sb2.append("Hello").append(" ").append("World");
// Append different types
sb.append(123); // "Hello World!123"
sb.append(true); // "Hello World!123true"
sb.append(3.14); // "Hello World!123true3.14"
Kindlale asukohale sisestamine
insert() meetod sisestab ette antud sisu määratud asukohale:
StringBuilder sb = new StringBuilder("Hello World");
sb.insert(6, "Beautiful "); // "Hello Beautiful World"
// Insert at beginning
sb.insert(0, ">> "); // ">> Hello Beautiful World"
Sisu eemaldamine
delete() meetod kustutab ette antud vahemikus oleva sisu ära.
deleteCharAt() meetod kustutab ette antud positsioonil oleva sümboli ära.
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 11); // "Hello" (removes " World")
// Delete single character
sb.deleteCharAt(0); // "ello"
Sisu ümberpööramine
reverse() meetod pöörab terve StringBuilder sisu ringi:
StringBuilder sb = new StringBuilder("Hello");
sb.reverse(); // "olleH"
Ligipääs sisule
toString() meetod tagastab terve sisu ühe sõnena:
StringBuilder sb = new StringBuilder("Hello");
String result = sb.toString(); // "Hello"
charAt() meetod tagastab sümboli, mis antud positsioonil asub:
StringBuilder sb = new StringBuilder("Hello");
char ch = sb.charAt(0); // 'H'
setCharAt() asendab määratud positsioonil oleva sümboli uue ette antud sümboliga:
StringBuilder sb = new StringBuilder("Hello");
sb.setCharAt(0, 'h'); // "hello"
Ning substring() tagastab alamsõne, mis jääb kahe indeksi vahele:
StringBuilder sb = new StringBuilder("Hello");
String sub = sb.substring(0, 2); // "He"
Pikkus ja puhvri puhastamine
length() meetod tagastab sisu suuruse, setLength() abil on võimalik määrata uus suurus.
Viimast saab näiteks kasutada puhvri tühjendamiseks:
StringBuilder sb = new StringBuilder("Hello");
int length = sb.length(); // 5 (number of characters)
sb.setLength(0); // StringBuilder is now empty