Introducere în clasa String în Java
Ce este clasa String?
- Clasa fundamentală în Java pentru manipularea textului
- Aparține pachetului
java.lang
(importat automat) - Imutabilă: odată creată, conținutul nu poate fi modificat
- O clasă specială cu suport direct în limbaj prin literali de tip șir
Crearea obiectelor String
// Prin literal de șir (recomandat)
String nume = "Maria";
// Prin constructor
String titlu = new String("Java Programming");
// Diverse constructori
String dinCharArray = new String(new char[]{'J', 'a', 'v', 'a'});
String dinBytes = new String(new byte[]{74, 97, 118, 97}, "UTF-8");
Imutabilitatea String-urilor
String text = "Hello";
text.concat(" World"); // Aceasta nu modifică string-ul original!
System.out.println(text); // Afișează doar "Hello"
// Atribuirea este necesară pentru a păstra rezultatul
text = text.concat(" World");
System.out.println(text); // Acum afișează "Hello World"
Pool-ul de String-uri
- Java menține un “String Pool” (bazin de string-uri) pentru optimizare
- Literalii identici folosesc aceeași referință în memorie
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2); // true (aceeași referință)
System.out.println(s1 == s3); // false (referințe diferite)
System.out.println(s1.equals(s3)); // true (conținut identic)
Metode importante
Obținerea informațiilor despre șir
String text = "Java Programming";
int lungime = text.length(); // 16
char primaLitera = text.charAt(0); // 'J'
int pozitieLitera = text.indexOf('P'); // 5
boolean contineJava = text.contains("Java"); // true
Compararea șirurilor
String s1 = "abc";
String s2 = "ABC";
boolean egale = s1.equals(s2); // false (case-sensitive)
boolean egaleIgnorandCaz = s1.equalsIgnoreCase(s2); // true
int comparatie = s1.compareTo(s2); // pozitiv (a > A în Unicode)
Extragerea sub-șirurilor
String text = "Java Programming";
String subText = text.substring(5); // "Programming"
String partialText = text.substring(0, 4); // "Java"
Transformarea șirurilor
String text = " Java Programming ";
String lower = text.toLowerCase(); // " java programming "
String upper = text.toUpperCase(); // " JAVA PROGRAMMING "
String trimmed = text.trim(); // "Java Programming"
String replaced = text.replace('a', 'o'); // "Jovo Progromming"
String[] parts = text.trim().split(" "); // ["Java", "Programming"]
Concatenarea șirurilor
// Utilizând operatorul +
String nume = "Ana";
String mesaj = "Salut, " + nume + "!"; // "Salut, Ana!"
// Utilizând metoda concat()
String rezultat = "Salut, ".concat(nume).concat("!");
// Utilizând StringBuilder (recomandat pentru multe concatenări)
StringBuilder sb = new StringBuilder();
sb.append("Salut, ");
sb.append(nume);
sb.append("!");
String final = sb.toString();
Performanță și optimizare
- String: imutabil, bun pentru valori fixe
- StringBuilder: mutabil, rapid, nu este thread-safe
- StringBuffer: mutabil, thread-safe, mai lent decât StringBuilder
// Ineficient pentru multe concatenări
String result = "";
for (int i = 0; i < 10000; i++) {
result += i; // Creează un nou obiect String la fiecare iterație!
}
// Eficient pentru multe concatenări
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i); // Modifică același obiect
}
String result = sb.toString(); // O singură conversie la final
Metode utile introduse în versiuni mai noi de Java
// Java 11+
String text = " Hello ";
String trimmedStart = text.stripLeading(); // "Hello "
String trimmedEnd = text.stripTrailing(); // " Hello"
String trimmedBoth = text.strip(); // "Hello"
// Verifică dacă un șir este gol sau conține doar spații
boolean isEmpty = text.isBlank(); // false
// Java 12+
String indented = "Hello".indent(4); // " Hello"
// Java 15+
String formatted = "%s are %d mere".formatted("Ana", 5); // "Ana are 5 mere"
Bune practici
- Folosiți literali de șir în loc de constructori pentru eficiență
- Utilizați
equals()
pentru compararea conținutului, nu==
- Folosiți StringBuilder pentru concatenări multiple
- Fiți atenți la imutabilitate - atribuiți rezultatul operațiilor
- Pentru căutări și manipulări complexe, considerați regex (Pattern și Matcher)
Exercițiu practic
Scrieți un program Java care:
- Primește un text de la utilizator
- Numără câte vocale conține
- Inversează textul
- Convertește prima literă din fiecare cuvânt la majusculă
import java.util.Scanner;
public class StringExercise {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Introduceți un text: ");
String text = scanner.nextLine();
scanner.close();
// Numără vocalele
int vocale = 0;
for (char c : text.toLowerCase().toCharArray()) {
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
vocale++;
}
}
// Inversează textul
String inversat = new StringBuilder(text).reverse().toString();
// Convertește prima literă din fiecare cuvânt la majusculă
StringBuilder result = new StringBuilder();
boolean nouCuvant = true;
for (char c : text.toCharArray()) {
if (Character.isWhitespace(c)) {
nouCuvant = true;
result.append(c);
} else {
if (nouCuvant) {
result.append(Character.toUpperCase(c));
nouCuvant = false;
} else {
result.append(c);
}
}
}
System.out.println("Text original: " + text);
System.out.println("Număr de vocale: " + vocale);
System.out.println("Text inversat: " + inversat);
System.out.println("Text cu prima literă majusculă: " + result.toString());
}
}
Concluzie
- String este o clasă fundamentală în Java pentru manipularea textului
- Imutabilitatea oferă avantaje de securitate și optimizare
- Alegerea corectă între String, StringBuilder și StringBuffer este importantă pentru performanță
- Java oferă un set bogat de metode pentru manipularea și transformarea șirurilor
- Înțelegerea profundă a clasei String este esențială pentru dezvoltarea eficientă în Java