V objektovo orientovanom programovaní, nemenný reťazec alebo predmety ktoré sa po vytvorení už nedajú upraviť. Ale môžeme zmeniť iba odkaz na objekt. Obmedzujeme na zmenu samotného objektu. The Reťazec je nemenný v Java z dôvodu bezpečnosti, synchronizácie a súbežnosti, ukladania do vyrovnávacej pamäte a načítania tried. Dôvodom, prečo je struna konečná, je zničiť nemennosť a nedovoliť iným, aby ju predlžovali.
Objekty String sa ukladajú do vyrovnávacej pamäte v fonde reťazcov a to vytvára Reťazec nemenný . K uloženým reťazcom literálov pristupuje viacero klientov. Vždy teda existuje riziko, že akcia vykonaná jedným klientom ovplyvní všetkých ostatných klientov. Napríklad, ak jeden klient vykoná akciu a zmení hodnotu reťazca z Pressure na PRESSURE, všetci zostávajúci klienti tiež prečítajú túto hodnotu. Z dôvodu výkonu bolo ukladanie objektov String do vyrovnávacej pamäte dôležité, takže na odstránenie tohto rizika musíme vytvoriť reťazec Immutable.
pete davidson
Toto je niekoľko ďalších dôvodov, prečo je reťazec nemenný:
- Fond reťazcov nemôže byť možný, ak reťazec nie je nemenný v jazyku Java. Tým sa ušetrí veľa miesta na halde JRE . Na tú istú reťazcovú premennú môže odkazovať viac ako jedna reťazcová premenná v oblasti. Vloženie reťazca tiež nemôže byť možné, ak by reťazec nebol nemenný.
- Ak nespravíme reťazec nemenným, bude to predstavovať vážnu bezpečnostnú hrozbu pre aplikáciu. Napríklad databázové užívateľské mená, heslá sa odovzdávajú ako reťazce na prijímanie databázových pripojení. The programovanie zásuvky popisy hostiteľa a portu sa tiež odovzdávajú ako reťazce. Reťazec je nemenný, takže jeho hodnotu nemožno zmeniť. Ak reťazec nezostane nemenný, môže každý hacker spôsobiť problém so zabezpečením aplikácie zmenou referenčnej hodnoty.
- String je bezpečný pre multithreading kvôli jeho nemennosti. Rôzne vlákna môžu pristupovať k jednej inštancii reťazca. Odstraňuje synchronizáciu pre bezpečnosť vlákien, pretože implicitne robíme reťazce bezpečné pre vlákna.
- Immutabilita dáva istotu načítania správnej triedy Classloaderom. Predpokladajme napríklad, že máme inštanciu, v ktorej sa pokúšame načítať triedu java.sql.Connection, ale zmeny v odkazovanej hodnote na triedu myhacked.Connection spôsobujú v našej databáze nežiaduce veci.
Poďme pochopiť koncept nemenného na príklade.
ImmutableString.java
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } }
Výkon:
Popis: Vyššie uvedený príklad môžeme pochopiť pomocou nasledujúceho diagramu:
sql ddl príkazy
V reťazci konštantný fond, Ahoj zostane nezmenený a vytvorí sa nový objekt reťazca s Ahoj Svet . Ukazuje, že struny sú nemenné. Referenčná premenná ukazuje na Ahoj nie k Ahoj Svet.
Ak chceme, aby sa to týkalo Ahoj Svet , musíme ju explicitne priradiť k tejto premennej. Napríklad:
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } }
Výkon: