String
-
Neměnnou třídou v Javě je
String
. -
Má to řadu dobrých důvodů - tytéž jednou definované řetězce lze používat souběžně z více míst programu
-
Nicméně i negativní stránky - někdy větší režie spojená s nemodifikovatelností:
String s = "Hello " + "World";
-
Kód vytvoří 3 objekty:
"Hello "
,"World"
a"Hello World"
. -
Cože? To je tak neefektivní?
-
Pokud by vysloveně vadilo, lze místo
String
použítStringBuilder
, který je modifikovatelný (mutable), viz dále
String pod lupou
-
Podívejme se na rozdíl
"Hello"
anew String("Hello")
.new String("Hello")
-
vytvoří pokaždé nový objekt
"Hello"
-
funguje na principu: jestli takový objekt zatím neexistuje, tak ho vytvořím, jinak vrátím odkaz na již existující objekt (uložen v paměti String constant pool)
Rovnost řetězců
String s1 = "Hello";
String s2 = "Hello";
boolean bTrue = (s1 == s2); // true, identical objects
s1 = new String("Hello");
s2 = new String("Hello");
boolean bFalse = (s1 == s2); // false, different objects though with same value
Metody třídy String
-
char charAt(int index)
— vráti prvek na daném indexu -
static String format(String format, Object… args)
— stejné jakoprintf
v C -
boolean isEmpty()
— vrátitrue
jestli je prázdný -
int length()
— velikost řetězce -
matches
,split
,indexOf
,startsWith
…
Více metod najdete v dokumentaci třídy String. |
-
Doporučujeme javadoc prostudovat, používaním existujících metod si ušetříte spoustu práce!
Víceřádkové řetězcové literály = textové bloky
-
V nových verzích Javy (15+) je možnost použít speciální formy řetězcových literálů:
String s = """
toto je první slovo řetězce, druhé,
druhý řádek,
třetí""";
-
Překladač vytvoří řetězec včetně oddělovačů řádku (dříve bylo možné pomocí znaku
\n
). -
Vynechá počáteční mezery (leading spaces), takže skutečně slovo "toto" bude prvními znaky řetězce
s
.
Třída StringBuilder
StringBuilder builder = new StringBuilder("Hello ");
builder.append("cruel ").append("world"); // method chain
builder.append("!");
String result = builder.toString();
-
StringBuilder
se průběžně modifikuje, přidáváme do něj další znaky -
Na závěr vytvoříme výsledný řetězec
-
StringBuilder
není thread safe, proto existuje její variantaStringBuffer
.
Návrhový vzor Builder
Třída StringBuilder
odpovídá návrhovému vzoru Builder
-
Builder obecně umožňuje konstruovat složitý objekt po částech a až poté získat celý výsledek
-
Metody
append
slouží pro přidávání kousků textu, tj. odpovídají metoděbuildPart()
ze vzoru. -
Metoda
toString
slouží k získání výsledného textu, tj. odpovídá metoděgetResult()
ze vzoru. -
Director
je náš kód používajícíStringBuilder