JAVA PAGRINDAI DETALIAU

Java StringBuilder

StringBuilder yra keičiama simbolių seka. Ji patogi, kai tekstą reikia papildyti ar redaguoti daug kartų, nes nereikia po kiekvieno pakeitimo kurti naujo String objekto.

String ir StringBuilder skirtumas

String objektas yra nekeičiamas. Prie teksto pridėjus naują dalį, sukuriamas naujas String objektas. StringBuilder savo turinį gali keisti tame pačiame objekte.

String ir StringBuilder palyginimas
SavybėStringStringBuilder
TurinysNekeičiamasKeičiamas
Paprastas tekstasLabai tinkamasDažnai nereikalingas
Daug pakeitimųGali kurti daug tarpinių objektųKeičia vieną kaupiamą turinį
Dažnas naudojimasPastovus ar retai keičiamas tekstasTeksto kūrimas cikle

Pirmasis StringBuilder

StringBuilder tekstas = new StringBuilder();

tekstas.append("Labas");
tekstas.append(" ");
tekstas.append("Rūta");
tekstas.append("!");

System.out.println(tekstas);
Konsolės rezultatas

Labas Rūta!

  1. new StringBuilder() sukuria tuščią teksto kūrimo objektą.
  2. append() prideda naują reikšmę turinio pabaigoje.
  3. Tarpą reikia pridėti pačiam, nes Java jo neįterpia automatiškai.
  4. println() gali tiesiogiai parodyti sukauptą turinį.

Tas pats objektas keičiamas kelis kartus

StringBuilder sarasas = new StringBuilder("Duona");

sarasas.append(", pienas");
System.out.println(sarasas);

sarasas.append(", obuoliai");
System.out.println(sarasas);
Konsolės rezultatas

Duona, pienas
Duona, pienas, obuoliai

Abu append() iškvietimai papildo tą patį sarasas objektą. Tai esminis skirtumas nuo String, kur kiekvienas sujungimas pateikia naują teksto objektą.

Teksto įterpimas, keitimas ir šalinimas

StringBuilder tekstas = new StringBuilder("Kava skani");

tekstas.insert(5, "labai ");
System.out.println(tekstas);

tekstas.replace(0, 4, "Arbata");
System.out.println(tekstas);

tekstas.delete(7, 13);
System.out.println(tekstas);
Konsolės rezultatas

Kava labai skani
Arbata labai skani
Arbata skani

  • insert(5, "labai ") įterpia tekstą nuo indekso 5.
  • replace(0, 4, "Arbata") pakeičia simbolius nuo indekso 0 iki 4, jo neįtraukiant.
  • delete(7, 13) pašalina žodį ir tarpą nurodytame intervale.

Metodų grandinė ir toString()

String vardas = "Mantas";
int taskai = 18;

String zinute = new StringBuilder()
    .append(vardas)
    .append(" surinko ")
    .append(taskai)
    .append(" taškų.")
    .toString();

System.out.println(zinute);
Konsolės rezultatas

Mantas surinko 18 taškų.

Kadangi append() grąžina tą patį StringBuilder, kitą metodą galima kviesti iš karto. Baigus kurti tekstą, toString() jį paverčia įprastu String.

StringBuilder cikle

Ciklas yra viena dažniausių vietų, kur StringBuilder iš tiesų naudingas:

String[] produktai = {"duona", "pienas", "obuoliai"};
StringBuilder sarasas = new StringBuilder();

for (int i = 0; i < produktai.length; i++) {
    if (i > 0) {
        sarasas.append(", ");
    }
    sarasas.append(produktai[i]);
}

System.out.println(sarasas);
Konsolės rezultatas

duona, pienas, obuoliai

  1. Ciklas po vieną aplanko visus produktus.
  2. Nuo antro produkto prieš pavadinimą pridedamas kablelis ir tarpas.
  3. Kiekvienas produktas pridedamas į tą patį StringBuilder.
  4. Pasibaigus ciklui visas sąrašas išspausdinamas vieną kartą.

reverse() ir length()

StringBuilder zodis = new StringBuilder("labas");

zodis.reverse();

System.out.println(zodis);
System.out.println(zodis.length());
Konsolės rezultatas

sabal
5

reverse() apverčia simbolių tvarką tame pačiame objekte. length() grąžina šiuo metu saugomų simbolių skaičių.

Kada rinktis StringBuilder?

  • kai tekstą kuri cikle;
  • kai vieną tekstą daug kartų papildai, įterpi, pakeiti ar trumpini;
  • kai iš daugelio atskirų reikšmių formuoji vieną rezultatą.
Paprastam sujungimui jo nereikia.

Eilutė String zinute = "Labas, " + vardas; yra aiški ir tinkama. StringBuilder didžiausią naudą suteikia tada, kai operacijos kartojamos daug kartų.

StringBuilder nėra sinchronizuotas ir nėra skirtas tam pačiam objektui saugiai keisti iš kelių gijų. Tokiam specialiam atvejui egzistuoja StringBuffer, tačiau įprastame vienos gijos kode dažniausiai pasirenkamas StringBuilder.