Miért változtatható meg a karakterlánc a Java-ban?
1. Bemutatkozás
A Java-ban a karakterláncok megváltoztathatatlanok. Az interjúkban meglehetősen elterjedt kézenfekvő kérdés: „Miért tervezik a húrokat megváltoztathatatlannak a Java-ban?”
James Goslingtól, a Java készítőjétől egyszer egy interjúban megkérdezték, hogy mikor kell megváltoztathatatlant használni, erre válaszol:
Bármikor megváltoztathatatlant használnék.
Támogatja továbbá érvelését, amely szerint a változhatatlanság által nyújtott jellemzők, például gyorsítótárazás, biztonság, könnyű újrafelhasználás replikálás nélkül stb.
Ebben az oktatóanyagban tovább megvizsgáljuk, miért döntöttek a Java nyelvtervezők a megtartása mellett Húr változhatatlan.
2. Mi az a megváltoztathatatlan objektum?
Változhatatlan tárgy egy olyan objektum, amelynek belső állapota a teljes létrehozása után állandó marad. Ez azt jelenti, hogy miután az objektumot hozzárendeltük egy változóhoz, sem a referenciát nem frissíthetjük, sem a belső állapotot semmilyen módon nem módosíthatjuk.
Külön cikkünk van, amely részletesen tárgyalja a megváltoztathatatlan tárgyakat. További információkért olvassa el a Javíthatatlan objektumok a Java-ban cikket.
3. Miért van Húr Változhatatlan Java-ban?
Az osztály változhatatlanságának fő előnyei a gyorsítótár, a biztonság, a szinkronizálás és a teljesítmény.
Beszéljük meg, hogyan működnek ezek a dolgok.
3.1. Bemutatni Húr Medence
A Húr a legszélesebb körben használt adatstruktúra. A gyorsítótár Húr literálok és újrafelhasználásuk rengeteg halomterületet takarít meg, mert más Húr változók ugyanarra az objektumra utalnak a Húr medence. Húr intern medence pontosan ezt a célt szolgálja.
A Java karakterlánckészlet az a különleges memória régió, ahol Húrok a JVM tárolja. Mivel Húrok változhatatlanok a Java-ban, a JVM optimalizálja a számukra lefoglalt memória mennyiségét azáltal, hogy minden literálból csak egy példányt tárol Húr a medencében. Ezt a folyamatot internálásnak nevezzük:
String s1 = "Hello World"; String s2 = "Hello World"; assertThat (s1 == s2) .isTrue ();
A jelenléte miatt Húr pool az előző példában két különböző változó mutat ugyanarra Húr objektumot a készletből, ezzel megtakarítva a kulcsfontosságú memóriaforrást.

Külön cikkünk van a Java-nak szentelve Húr Medence. További információért olvassa el a cikket.
3.2. Biztonság
A Húr széles körben használják a Java alkalmazásokban olyan érzékeny információk tárolására, mint a felhasználónevek, jelszavak, kapcsolat URL-ek, hálózati kapcsolatok stb. Széles körben használják a JVM osztályrakodói osztályok betöltése közben is.
Ezért biztosítás Húr osztály kulcsfontosságú az egész alkalmazás biztonsága szempontjából általában. Vegyük például fontolóra ezt az egyszerű kódrészletet:
void criticalMethod (String felhasználónév) {// végezzen biztonsági ellenőrzéseket, ha (! isAlphaNumeric (felhasználónév)) {dobja az új SecurityException () -t; } // néhány másodlagos feladat elvégzése inicializáljaDatabase (); // kritikus feladat connection.executeUpdate ("UPDATE Customers SET Status = 'Aktív'" + "WHERE Felhasználónév = '" + felhasználónév + "" "); }
A fenti kódrészletben tegyük fel, hogy a Húr megbízhatatlan forrásból származó tárgy. Kezdetben elvégezzük az összes szükséges biztonsági ellenőrzést annak ellenőrzésére, hogy a Húr csak alfanumerikus, majd további műveletek következnek.
Ne feledje, hogy a megbízhatatlan forráshívó módszerünk még mindig utal erre felhasználónév tárgy.
Ha Húrok mutánsak voltak, akkor mire végrehajtjuk a frissítést, nem lehetünk biztosak abban, hogy a Húr a biztonsági ellenőrzések elvégzése után is biztonságosak lennénk. A megbízhatatlan hívó módszer továbbra is rendelkezik referenciával, és megváltoztathatja a Húr az integritás-ellenőrzések között. Így a lekérdezésünk hajlamos az SQL injekciókra ebben az esetben. Olyan változtatható Húrok idővel a biztonság romlásához vezethet.
Az is megtörténhet, hogy a Húrfelhasználónév látható egy másik szál számára, amely az integritás ellenőrzése után megváltoztathatja az értékét.
Általában ebben az esetben a megváltoztathatatlanság segít megmenteni, mert kényes kóddal könnyebben kezelhető, ha az értékek nem változnak, mert kevesebb olyan művelet közbeiktatása van, amely befolyásolhatja az eredményt.
3.3. Szinkronizálás
Mivel megváltoztathatatlan, automatikusan a Húr szál biztonságos, mivel több szálról nem érhetők el.
Ennélfogva a megváltoztathatatlan objektumok általában több, egyszerre futó szálon oszthatók meg. Menetbiztosak is mert ha egy szál megváltoztatja az értéket, akkor ahelyett, hogy ugyanezt módosítaná, egy új Húr a Húr medence. Ennélfogva, Húrok biztonságosak a többszálas meneteknél.
3.4. Hashcode gyorsítótár
Mivel Húr az objektumokat bőségesen használják adatstruktúraként, és széles körben használják hash implementációkban is HashMap, HashTable, HashSetstb. Ha ezeket a hash implementációkat használja, hash kód() metódust elég gyakran hívják a csoportosításhoz.
A változtathatatlanság garantálja Húrok hogy az értékük nem változik. Így a hash kód() módszert felülírják Húr osztály a gyorsítótárazás megkönnyítésére, oly módon, hogy az első során kiszámítsák és gyorsítótárazzák a kivonatot hash kód() hívás és azóta ugyanaz az érték kerül vissza.
Ez pedig javítja azoknak a gyűjteményeknek a teljesítményét, amelyek hash implementációkat használnak, amikor együtt működnek Húr tárgyakat.
Másrészt pedig változtatható Húrok két különböző hashkódot állít elő a beillesztés és a visszakeresés idején, ha a Húr a művelet után módosult, potenciálisan elveszítve az értékobjektumot a Térkép.
3.5. Teljesítmény
Mint korábban láttuk, Húr medence azért létezik, mert Húrok változhatatlanok. Viszont növeli a teljesítményt azáltal, hogy halmozott memóriát takarít meg, és gyorsabb hozzáférést biztosít a hash implementációkhoz, ha együtt működnek vele Húrok.
Mivel Húr a leggyakrabban használt adatstruktúra, amely javítja a Húr jelentős hatással vannak az egész alkalmazás teljesítményének javítására általában.
4. Következtetés
E cikk révén arra következtethetünk A karakterláncok pontosan megváltoztathatatlanok, így referenciáik normál változóként kezelhetők, és körbevezethetők, a módszerek között és a szálak között, anélkül, hogy aggódnunk kellene, hogy a tényleges Húr objektum, amelyre mutat, megváltozik.
Megtudtuk azt is, hogy mi lehet a többi ok, ami a következőket késztette Jáva nyelvtervezők, hogy ezt az osztályt megváltoztathatatlanná tegyék.