Sobes.tech
Middle

Kodėl Java tipo String reikšmė yra nekintama?

sobes.tech AI

Atsakymas iš AI

String reikšmė Java yra nepakitusi dėl kelių priežasčių:

  • Sriegių saugumas (Thread Safety): Nepakitę objektai gali būti saugiai naudojami kelių sriegių vienu metu be išorinės sinchronizacijos. Kadangi String būseną galima pakeisti tik kuriant, nėra rizikos lenktynių sąlygų skaitymo ar perdavimo metu.

    // Pavyzdys: du sriegi pasiekia tą patį eilutę
    String sharedString = "Hello";
    
    // 1-asis sritis gali saugiai naudoti sharedString
    new Thread(() -> {
        System.out.println(sharedString.toUpperCase());
    }).start();
    
    // 2-asis sritis taip pat gali saugiai naudoti sharedString
    new Thread(() -> {
        System.out.println("Ilgis: " + sharedString.length());
    }).start();
    
  • Veiksmingumas (Pooling ir Sharing): Dėl nepakitimo JVM gali optimizuoti atminties naudojimą naudodama eilutės baseiną (String Pool). Jei keli kintamieji nurodo tą pačią reikšmę, jie gali rodyti į tą patį objektą baseine, taupant atmintį.

    String s1 = "World"; // Sukuriamas "World" objektas baseine
    String s2 = "World"; // Nurodo tą patį objektą baseine
    String s3 = new String("World"); // Sukuriamas naujas objektas už baseino ribų
    
    System.out.println(s1 == s2); // true - nurodo tą patį objektą
    System.out.println(s1 == s3); // false - nurodo skirtingus objektus
    
  • Naudojimas kaip raktas Map'e: String dažnai naudojamas kaip raktas žemėlapiuose (HashMap). Jei eilutė būtų keičiamas, jos hash kodas galėtų pasikeisti po pridėjimo į žemėlapį, todėl būtų neįmanoma rasti atitinkamos reikšmės. Nepakitimas garantuoja, kad hash kodas lieka pastovus.

    import java.util.HashMap;
    import java.util.Map;
    
    Map<String, Integer> ages = new HashMap<>();
    ages.put("Alice", 30);
    // Jei "Alice" būtų keičiamas, paieška pagal "Alice" gali neveikti
    System.out.println(ages.get("Alice")); // 30
    
  • Sauga (Security): Eilutės naudojamos saugoti konfidencialią informaciją, pvz., failų pavadinimus, tinklo adresus ar naudotojų slaptažodžius. Nepakitimas užkerta kelią atsitiktiniams ar kenkėjiškiems pakeitimams po inicializacijos, didinant saugumą.

Šie veiksniai daro String pagrindiniu ir patikimu duomenų tipu Java kalboje.