Sobes.tech
Middle

Miks Java String tüübi väärtus on muutumatu?

sobes.tech AI

Vastus AI-lt

Java-s String väärtus on muudetamatu mitmel põhjusel:

  • Lõimude turvalisus (Thread Safety): Muudetamatud objektid võivad olla ohutult kasutatavad mitme lõime poolt samaaegselt ilma välise sünkronisatsioonita. Kuna String-i olek ei saa pärast loomist muutuda, puudub risk lõimede vahelise rassiolukorra tekkeks lugemisel või edastamisel.

    // Näide: kaks lõime pääsevad ühe stringi juurde
    String sharedString = "Hello";
    
    // Lõim 1 võib ohutult kasutada sharedString-i
    new Thread(() -> {
        System.out.println(sharedString.toUpperCase());
    }).start();
    
    // Lõim 2 võib samuti ohutult kasutada sharedString-i
    new Thread(() -> {
        System.out.println("Pikkus: " + sharedString.length());
    }).start();
    
  • Tõhusus (Puhverdamine ja Jagamine): Muudetamatuse tõttu saab JVM optimeerida mälu kasutust, kasutades stringide panka (String Pool). Kui mitu muutujat viitavad sama väärtuse, võivad nad viidata sama objekti panka, mis säästab mälu.

    String s1 = "World"; // Loob objekti "World" pangas
    String s2 = "World"; // Viitab samale objekti pangas
    String s3 = new String("World"); // Loob uue objekti väljaspool panka
    
    System.out.println(s1 == s2); // tõene - viitavad samale objekti
    System.out.println(s1 == s3); // väär - viitavad erinevatele objektidele
    
  • Kasutamine võtmena kaardil (Map): String kasutatakse sageli võtmena hash-kaartides (HashMap). Kui string oleks muudetav, võiks tema hash-kood muutuda pärast lisamist kaardile, mis muudab vastava väärtuse otsimise võimatuks. Muudetamatus tagab, et hash-kood jääb konstantseks.

    import java.util.HashMap;
    import java.util.Map;
    
    Map<String, Integer> ages = new HashMap<>();
    ages.put("Alice", 30);
    // Kui "Alice" oleks muudetav, ei pruugi otsing "Alice"-ga töötada
    System.out.println(ages.get("Alice")); // 30
    
  • Turvalisus (Security): Stringe kasutatakse konfidentsiaalse teabe, näiteks failinimede, võrguaadresside või kasutajaparoolide salvestamiseks. Muudetamatus takistab juhuslikke või pahatahtlikke muutusi nende väärtuste puhul pärast initsialiseerimist, suurendades turvalisust.

Need tegurid muudavad String põhjaliku ja usaldusväärse andmetüübina Java-s.