Sobes.tech
Junior

Co wiesz o klasie String w Java?

sobes.tech AI

Odpowiedź od AI

String w Javie to niezmienna (immutable) klasa reprezentująca ciąg znaków.

Kluczowe cechy:

  • Niezmienność: Po utworzeniu obiektu String, jego zawartość nie może zostać zmieniona. Każda operacja, która wygląda na modyfikację łańcucha, w rzeczywistości zwraca nowy obiekt String. To czyni obiekty String bezpiecznymi w środowiskach wielowątkowych.
  • Pula łańcuchów (String Pool): Java utrzymuje pulę łańcuchów. Gdy tworzony jest literał łańcucha (np. "cześć"), JVM najpierw sprawdza pulę. Jeśli taki łańcuch już istnieje, zwraca referencję do istniejącego obiektu. Jeśli nie, tworzy nowy obiekt w puli. Użycie konstruktora new String("cześć") zawsze tworzy nowy obiekt poza pulą.
  • Przeciążenie operatora +: Operator + jest przeciążony do konkatenacji łańcuchów. Kompilator może zoptymalizować konkatenację, używając StringBuilder lub StringBuffer dla lepszej wydajności.
  • Implementacja interfejsów: String implementuje interfejsy Serializable, Comparable<String> i CharSequence.
  • Metody: Klasa String zapewnia wiele przydatnych metod do pracy z łańcuchami: length(), charAt(), substring(), indexOf(), equals(), equalsIgnoreCase(), startsWith(), endsWith(), trim(), replace(), split() i inne.

Przykłady tworzenia łańcuchów:

// Tworzenie przez literał (używa puli łańcuchów)
String str1 = "Hello";

// Tworzenie przez konstruktor (tworzy nowy obiekt poza pulą)
String str2 = new String("World");

// Tworzenie z tablicy znaków
char[] chars = {'J', 'a', 'v', 'a'};
String str3 = new String(chars);

Porównanie łańcuchów:

  • equals(): Porównuje zawartość łańcuchów.
  • ==: Porównuje referencje obiektów. Dla literałów łańcuchów o tym samym zawartości, zazwyczaj wskazują na tę samą referencję w puli, ale dla obiektów tworzonych za pomocą new String(), == będzie false, nawet jeśli zawartość jest taka sama.
String s1 = "java";
String s2 = "java";
String s3 = new String("java");

System.out.println(s1 == s2); // true (obie z puli)
System.out.println(s1 == s3); // false (s3 to nowy obiekt)
System.out.println(s1.equals(s3)); // true (porównuje zawartość)

Aby modyfikować łańcuchy w Javie, używa się klas StringBuilder (niezsynchronizowana, dla środowisk jedno-wątkowych) i StringBuffer (zsynchronizowana, dla środowisk wielowątkowych), które są mutowalne.

// Przykład z StringBuilder
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
String result = sb.toString(); // Konwersja z powrotem na String
System.out.println(result); // Wypisze: Hello World