String-uri și text blocks în Java

Variabile și tipuri Java 15 (text blocks)

Textul în Java este de tip String, imutabil; text blocks (""" ... """) permit texte pe mai multe rânduri fără \n și ghilimele escape.

Sintaxă
String nume = "Ana";
String salut = "Bună, " + nume + "!";
String formatat = "%s are %d ani".formatted(nume, 20);
String bloc = """
    text pe
    mai multe rânduri
    """;

Ce face String-uri și text blocks

String este clasa pentru text. Literalii se scriu între ghilimele: "Iași". Un String este imutabil: metodele ca toUpperCase() sau replace() nu modifică textul, ci returnează un text nou. Textele se compară cu equals, nu cu ==.

Textele se lipesc cu + sau se formatează cu String.format / "...".formatted(...). Când construiești un text în multe bucăți (într-o buclă), StringBuilder este mult mai eficient.

Text blocks (Java 15) încep cu """ urmat de rând nou și se termină cu """. Păstrează rândurile așa cum le scrii, fără \n și fără să escapezi ghilimelele. Indentarea comună este eliminată automat, după poziția celui mai din stânga rând (inclusiv a lui """ de final). Un \ la final de rând lipește rândul cu următorul.

Exemple

Exemplul 1: Operații de bază cu texte

Metodele returnează texte noi; variabila oras rămâne neschimbată.

public class Main {
    public static void main(String[] args) {
        String oras = "Cluj-Napoca";
        System.out.println("lungime: " + oras.length());
        System.out.println("majuscule: " + oras.toUpperCase());
        System.out.println("conține Napoca? " + oras.contains("Napoca"));
        System.out.println("primul cuvânt: " + oras.substring(0, oras.indexOf('-')));
        System.out.println("înlocuit: " + oras.replace("-", " "));
        System.out.println("original: " + oras);

        String mesaj = "%s are %d ani și media %.2f".formatted("Ana", 20, 9.456);
        System.out.println(mesaj);
        System.out.println("equals: " + "iași".equals("Iași") + ", equalsIgnoreCase: " + "iași".equalsIgnoreCase("Iași"));
    }
}

Rezultat

lungime: 11
majuscule: CLUJ-NAPOCA
conține Napoca? true
primul cuvânt: Cluj
înlocuit: Cluj Napoca
original: Cluj-Napoca
Ana are 20 ani și media 9.46
equals: false, equalsIgnoreCase: true

Exemplul 2: Text block pentru JSON

Ghilimelele din interior nu mai trebuie escapate. Indentarea comună (cele 12 spații din cod) dispare, iar rândul cu """ de final adaugă un \n la sfârșit.

public class Main {
    public static void main(String[] args) {
        String nume = "Maria";
        String json = """
            {
              "nume": "%s",
              "oras": "Brașov",
              "note": [9, 10, 8]
            }
            """.formatted(nume);
        System.out.print(json);
        System.out.println("rânduri: " + json.lines().count());
    }
}

Rezultat

{
  "nume": "Maria",
  "oras": "Brașov",
  "note": [9, 10, 8]
}
rânduri: 5

Exemplul 3: StringBuilder și secvențe escape în text blocks

StringBuilder construiește textul fără să creeze un String nou la fiecare pas. În text block, \ la final de rând unește rândurile, iar \s păstrează un spațiu de la final.

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= 5; i++) {
            sb.append(i);
            if (i < 5) {
                sb.append(", ");
            }
        }
        System.out.println("numere: " + sb);

        String poezie = """
            Pe lângă plopii fără soț \
            adesea am trecut;
            linie cu spațiu final\s
            gata""";
        System.out.println(poezie);
    }
}

Rezultat

numere: 1, 2, 3, 4, 5
Pe lângă plopii fără soț adesea am trecut;
linie cu spațiu final 
gata

Greșeli frecvente

  • Compararea textelor cu == în loc de equals.
  • Apelarea oras.toUpperCase(); fără a folosi rezultatul: textul original nu se schimbă. Scrie oras = oras.toUpperCase();.
  • Text block început pe același rând: """text""" nu compilează; după """ de deschidere trebuie rând nou.
  • Concatenarea cu + în bucle mari: folosește StringBuilder.

Comenzi înrudite

  • char: Tipul pentru un singur caracter Unicode (16 biți), scris între apostrofuri: ‘a’, ‘Ș’, ‘\n’.
  • Operatori: Operatorii aritmetici, de comparație, logici, de atribuire, ternar și pe biți din Java, cu ordinea lor de evaluare.
  • equals și hashCode: equals decide când două obiecte sunt „egale” ca valoare; hashCode trebuie rescris împreună cu el, altfel HashMap și HashSet nu funcționează corect.
  • Array-uri: Un array păstrează un număr fix de elemente de același tip, accesate prin indice de la 0 la length – 1.