Elméleti alapozás
Java-nyelv néhány összetett adattípusa
StringBuilder és StringBuffer
A fejezet eredményes tanulmányozásához mindenképpen olvassuk el a Java-nyelv néhány összetett adattípusa - String című fejezetet és értsük meg a benne foglaltakat!
A StringBuilder (és Stringbuffer) osztály hivatott kiküszöbölni a String osztály egyik kevésbé előnyös tulajdonságát: egy létrehozott String objektum megváltoztathatatlan, ha pedig ezt megkíséreljük, akkor róla másolatok fognak keletkezni, amelyek processzoridőt és további memóriát foglalnak le. Főként ezen problémák megoldására komponálták meg a StringBuilder (és Stringbuffer) osztályokat, amelyek tehát nagy és gyakran változó karakterfüzérek gyors elérését és manipulációját teszik lehetővé.
A StringBuilder és Stringbuffer osztályok lényegében azonos funkcionalitásúak, azzal a nem elhanyagolható különbséggel, hogy míg a StringBuffer képes együttdolgozni több programszálon futó, szinkronizált metódusokkal (synchronized methods), addig a StringBuilder osztály nem.
Az azonos funkcionalitás miatt a továbbiakban a StringBuilder osztályt használom fel a programozási példák bemutatásakor.
A StringBuilder objektum szintén karaktertömbben (char tomb[]) tárolja az információt, ám ezen tömb mérete már változtatható. A karakterek tömbindexe szintén 0-nál kezdődik.
Egy StringBuilder objektumot a szokásos módon a new paranccsal kell létrehoznunk. Ha méret nincs megadva vagy nem kitalálható, akkor a kezdőméret 16 karakternyi lesz...
StringBuilder sb = new StringBuilder();
...de megadhatunk kezdőméretet is...
StringBuilder sb = new StringBuilder(20);
...vagy konkrét karakterfüzért:
StringBuilder sb = new StringBuilder("Java");
public class
Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Java");
System.out.println(sb);
}
}
Végeredmény:
Java
Az objektum létrehozása után a StringBuilder osztály rendkívül széles körben alkalmazható, rugalmas, beépített metódusokkal áll rendelkezésre. Nézzünk meg néhányat a legfontosabbak közül. Kezdjük 2 olyan metódussal, amelyek nem érhetők el a String osztályban:
-
append() - létező StringBuilder objektumhoz további értékeket fűz hozzá - ez már bármilyen adattípus lehet!
-
insert() - adott karakterpozícióban paraméterben megadott értéket szúr be az eredetibe - bármilyen adattípus fogadására képes.
Ezeket a függvényeket külön is vizsgáljuk meg!
public class Main {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder();
System.out.println(sb1.append("Cirbolya"));
System.out.println(sb1.append(" és "));
System.out.println(sb1.append("Borbolya"));
System.out.println(sb1.insert(8, ", Füles"));
}
}
Végeredmény:
Cirbolya
Cirbolya és
Cirbolya és Borbolya
Cirbolya, Füles és Borbolya
Érdekes lehetőség az úgynevezett utasítás-, vagy metódusláncolás (method
chaining - például:
b1.append("F").append("ü").append("l")...):
public class Main {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder();
System.out.println(sb1.append("F").append("ü").append("l").append("e").append("s"));
}
}
Végeredmény:
Fúles
A további függvények hasonlóak a String osztályban is elérhetőkhöz:
-
equals() - megvizsgálja, hogy a paraméterként bevitt StringBuilder objektum tartalmilag egyezik-e az eredetivel,
-
length() - visszaadja a StringBuilder objektum hosszát,
-
indexOf() - visszaadja a keresett karakter indexszámát,
-
charAt() - megmondja, hogy megadott indexnél melyik karakter található,
-
substring() - a megadott paraméterek alapján az eredetiből kiemel egy kisebbet,
-
replace() - új karaktereket cserél fel régiekre,
-
compareTo() - tartalmi összehasonlítás, mint az equals() esetében,
-
concat() - az eredeti objektumhoz egy paraméterként megadott karakterszekvenciát fűz hozzá.
public class Main {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("Cirbolya és
Borbolya");
String sb2 = new String("Cirbolya");
System.out.println(sb1.equals(sb2));
System.out.println(sb1.length());
System.out.println(sb1.indexOf("C"));
System.out.println(sb1.charAt(0));
System.out.println(sb1.substring(9, 11));
System.out.println(sb1.replace(0, 8, "Füles"));
System.out.println(sb2.compareTo("Cirbolya"));
System.out.println(sb2.concat(" és barátai"));
}
}
Végeredmény:
false
20
0
C
és
Füles és Borbolya
0 (azaz hasonlóak)
Cirbolya és barátai
További, csakis a StringBuilder osztályban elérhető metódusok (a teljesség igény nélkül):
-
toString() - StringBuilder objektumot String objektumra konvertál át,
-
subSequence() - a megadott paraméterek alapján az eredetiből kiemel egy kisebbet,
-
delete() - adott karakterpozícióban paraméterben megadott értéket töröl.
public class Main {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("Cirbolya és
Borbolya");
System.out.println(sb1.subSequence(0, 8));
System.out.println(sb1.delete(0, 12));
System.out.println(sb1.toString());
}
}
Végeredmény:
Cirbolya
Borbolya
Borbolya