Sobes.tech
Junior

Opowiedz o klasie String w języku programowania Java.

sobes.tech AI

Odpowiedź od AI

Klasa String w Javie reprezentuje niezmienniczą sekwencję znaków.

Główne cechy i właściwości:

  • Niezmienniczość: Po utworzeniu obiektu String, jego zawartość nie może być zmieniona. Każda operacja, która wydaje się modyfikować łańcuch (np. konkatenacja), w rzeczywistości tworzy nowy obiekt String. To zwiększa bezpieczeństwo i bezpieczeństwo w środowiskach wielowątkowych.
  • Przeciążenie operatora +: Dla łańcuchów operator + został przeciążony, aby wykonywać konkatenację.
  • Dwa sposoby tworzenia:
    • Za pomocą literału łańcucha: String s1 = "Hello"; - tworzony w puli łańcuchów (String Pool).
    • Za pomocą operatora new: String s2 = new String("World"); - tworzony na stercie (Heap), może tworzyć nowy obiekt nawet jeśli istnieje już taki sam literał w puli.
  • Pula łańcuchów (String Pool): Obszar na stercie, w którym przechowywane są literały łańcuchów w celu optymalizacji pamięci. Podczas tworzenia literału JVM najpierw sprawdza pulę. Jeśli taki łańcuch już istnieje, zwraca odwołanie do istniejącego obiektu. Jeśli nie, tworzy nowy obiekt i umieszcza go w puli.
  • Przydatne główne metody:
    • length(): Zwraca długość łańcucha.
    • charAt(int index): Zwraca znak na podanym indeksie.
    • substring(int beginIndex, int endIndex): Zwraca podłańcuch.
    • contains(CharSequence s): Sprawdza, czy łańcuch zawiera podaną sekwencję znaków.
    • indexOf(int ch) / indexOf(String str): Zwraca pierwszy indeks wystąpienia znaku lub podłańcucha.
    • equals(Object anObject): Porównuje zawartość łańcuchów. Ważne jest używanie equals() do porównywania zawartości, a nie ==, które porównuje odwołania.
    • equalsIgnoreCase(String anotherString): Porównuje łańcuchy bez uwzględniania wielkości liter.
    • replace(char oldChar, char newChar) / replace(CharSequence target, CharSequence replacement): Zamienia znaki lub podłańcuchy.
    • trim(): Usuwa spacje z początku i końca.
    • split(String regex): Dzieli łańcuch na podłańcuchy według separatora.

Przykład tworzenia i niektórych operacji:

// Tworzenie za pomocą literału
String str1 = "Java";

// Tworzenie za pomocą new
String str2 = new String("Java");

// Konkatenacja
String str3 = str1 + " is amazing";

// Porównanie zawartości (używając equals, a nie ==)
boolean areEqualContent = str1.equals(str2); // true

// Porównanie odwołań (używając ==)
boolean areEqualReference = (str1 == str2); // false

// Długość łańcucha
int length = str3.length();

// Pobranie znaku
char firstChar = str1.charAt(0); // 'J'

// Sprawdzenie zawartości
boolean containsIs = str3.contains("is"); // true

Niezmienniczość String może prowadzić do nieefektywności przy wielokrotnych modyfikacjach łańcucha, ponieważ za każdym razem tworzony jest nowy obiekt. Dla takich scenariuszy lepiej używać StringBuilder lub StringBuffer.