Sobes.tech
Middle

Zašto je vrednost tipa String u Javi nepromenljiva?

sobes.tech АИ

Одговор од АИ

Vrednost String u Javi je nepromenljiva iz nekoliko razloga:

  • Bezbednost niti (Thread Safety): Nepromenljive objekte je sigurno koristiti u više niti istovremeno bez potrebe za spoljašnjom sinhronizacijom. Pošto stanje String ne može da se promeni nakon kreiranja, nema rizika od trkačkih uslova pri čitanju ili prosleđivanju niza između niti.

    // Primer: dve niti pristupaju istom nizu
    String sharedString = "Hello";
    
    // Niti 1 može sigurno koristiti sharedString
    new Thread(() -> {
        System.out.println(sharedString.toUpperCase());
    }).start();
    
    // Niti 2 takođe može sigurno koristiti sharedString
    new Thread(() -> {
        System.out.println("Dužina: " + sharedString.length());
    }).start();
    
  • Efikasnost (Pooling i Sharing): Zbog nepromenljivosti, JVM može da optimizuje korišćenje memorije koristeći bazen nizova (String Pool). Ako više promenljivih ukazuje na istu vrednost, one mogu da ukazuju na isti objekat u bazenu, čime se štedi memorija.

    String s1 = "World"; // Kreira se objekat "World" u bazenu
    String s2 = "World"; // Ukazuje na isti objekat u bazenu
    String s3 = new String("World"); // Kreira se novi objekat izvan bazena
    
    System.out.println(s1 == s2); // true - ukazuju na isti objekat
    System.out.println(s1 == s3); // false - ukazuju na različite objekte
    
  • Korišćenje kao ključeva u Map: String se često koristi kao ključ u heš mapama (HashMap). Ako bi niz bio promenljiv, njegov heš kod bi se mogao promeniti nakon dodavanja u mapu, što bi onemogućilo pronalaženje odgovarajuće vrednosti. Nepromenljivost garantuje da ostaje konstantan.

    import java.util.HashMap;
    import java.util.Map;
    
    Map<String, Integer> ages = new HashMap<>();
    ages.put("Alice", 30);
    // Ako bi "Alice" mogao da se promeni, pretraga po "Alice" ne bi radila
    System.out.println(ages.get("Alice")); // 30
    
  • Bezbednost (Security): Nizovi se koriste za čuvanje poverljivih informacija, poput imena fajlova, mrežnih adresa ili korisničkih lozinki. Nepromenljivost sprečava slučajne ili zlonamerne promene ovih vrednosti nakon inicijalizacije, čime se povećava sigurnost.

Ovi faktori čine String fundamentalnim i pouzdanim tipom podataka u Javi.