logo

Varför String är Immutable eller Final i Java

I objektorienterad programmering är oföränderlig sträng eller objekt som inte kan ändras när den väl har skapats. Men vi kan bara ändra referensen till objektet. Vi begränsar till att ändra själva objektet. De Sträng är oföränderlig i Java på grund av säkerhet, synkronisering och samtidighet, cachning och klassladdning. Anledningen till att göra strängen final är att förstöra oföränderligheten och att inte tillåta andra att förlänga den.

String-objekten cachelagras i String-poolen, och det gör Sträng oföränderlig . De cachade strängliteralerna nås av flera klienter. Så det finns alltid en risk, där åtgärder som utförs av en klient påverkar alla andra klienter. Till exempel, om en klient utför en åtgärd och ändrar strängvärdet från Pressure till PRESSURE, kommer alla återstående klienter också att läsa det värdet. Av prestandaskäl var cachning av String-objekt viktigt, så för att ta bort den risken måste vi göra String Immutable.

Varför String är Immutable eller Final i Java

Det här är några fler anledningar till att göra String oföränderlig:

  • Stringpoolen kan inte vara möjlig om String inte är oföränderlig i Java. Mycket högutrymme sparas av JRE . Samma strängvariabel kan refereras till av mer än en strängvariabel i poolen. Stränginternering kan inte heller vara möjligt om strängen inte skulle vara oföränderlig.
  • Om vi ​​inte gör strängen oföränderlig kommer den att utgöra ett allvarligt säkerhetshot för applikationen. Databasanvändarnamn och lösenord skickas till exempel som strängar för att ta emot databasanslutningar. De socket programmering värd- och portbeskrivningar skickas också som strängar. Strängen är oföränderlig, så dess värde kan inte ändras. Om strängen inte förblir oföränderlig kan vilken hackare som helst orsaka ett säkerhetsproblem i applikationen genom att ändra referensvärdet.
  • Stringen är säker för flertrådning på grund av dess oföränderlighet. Olika trådar kan komma åt en enda 'String-instans'. Det tar bort synkroniseringen för trådsäkerhet eftersom vi implicit gör strängar trådsäkra.
  • Immutability ger säkerheten att ladda rätt klass av Classloader. Anta till exempel att vi har en instans där vi försöker ladda java.sql.Connection-klassen men ändringarna i det refererade värdet till klassen myhacked.Connection gör oönskade saker med vår databas.

Låt oss förstå begreppet oföränderligt genom ett exempel.

ImmutableString.java

 import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } } 

Produktion:

Varför String är Immutable eller Final i Java

Beskrivning: Vi kan förstå exemplet ovan med hjälp av följande diagram:

Varför String är Immutable eller Final i Java

I strängen konstant pool, den Hallå förblir oförändrad och ett nytt strängobjekt skapas med Hej världen . Det visar att strängarna är oföränderliga. Referensvariabeln pekar på Hallå inte till Hej världen.

Om vi ​​vill att det hänvisar till Hej världen måste vi uttryckligen tilldela den till den variabeln. Till exempel:

 import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } } 

Produktion:

Varför String är Immutable eller Final i Java