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.