Sobes.tech
Middle

De ce valoarea tipului String în Java este inalterabilă?

sobes.tech AI

Răspuns de la AI

Valoarea String în Java este imutabilă din mai multe motive:

  • Siguranța firelor (Thread Safety): Obiectele imutabile pot fi utilizate în siguranță de mai multe fire simultan fără a necesita sincronizare externă. Deoarece starea lui String nu poate fi schimbată după crearea sa, nu există riscul de condiții de cursă în timpul citirii sau transmiterii șirului între fire.

    // Exemplu: două fire accesează același șir
    String sharedString = "Hello";
    
    // Firul 1 poate folosi în siguranță sharedString
    new Thread(() -> {
        System.out.println(sharedString.toUpperCase());
    }).start();
    
    // Firul 2 poate de asemenea folosi în siguranță sharedString
    new Thread(() -> {
        System.out.println("Lungime: " + sharedString.length());
    }).start();
    
  • Eficiență (Pooling și Sharing): Datorită imutabilității, JVM poate optimiza utilizarea memoriei folosind un pool de șiruri (String Pool). Dacă mai multe variabile fac referire la aceeași valoare de șir, ele pot indica același obiect din pool, economisind memorie.

    String s1 = "World"; // Se creează un obiect "World" în pool
    String s2 = "World"; // Se referă la același obiect în pool
    String s3 = new String("World"); // Se creează un nou obiect în afara pool-ului
    
    System.out.println(s1 == s2); // true - indică același obiect
    System.out.println(s1 == s3); // false - indică obiecte diferite
    
  • Utilizare ca chei în Map: String este adesea utilizat ca cheie în hărți hash (HashMap). Dacă șirul ar fi modificabil, codul său hash s-ar putea schimba după adăugare, făcând imposibilă găsirea valorii corespunzătoare. Imutabilitatea garantează că codul hash rămâne constant.

    import java.util.HashMap;
    import java.util.Map;
    
    Map<String, Integer> ages = new HashMap<>();
    ages.put("Alice", 30);
    // Dacă "Alice" ar fi modificabil, căutarea după "Alice" s-ar putea să nu reușească
    System.out.println(ages.get("Alice")); // 30
    
  • Siguranță (Security): Șirurile sunt utilizate pentru stocarea informațiilor confidențiale, cum ar fi nume de fișiere, adrese de rețea sau parole de utilizator. Imutabilitatea previne modificări accidentale sau malițioase ale acestor valori după inițializare, sporind securitatea.

Acești factori fac ca String să fie un tip de date fundamental și fiabil în Java.