Wiele osób na początku zastanawia się (w tym ja) o co chodzi z tym, że stringi są Immutable i dlaczego? Przecież mogę sobie stworzyć zmienną z jakimś Stringiem, następnie go zmienić więc o co chodzi?
public static void main(String[] args) {
String x = "foo";
x = "boo";
}
Tak w rzeczywistości możemy zawartość tej zmiennej zmienić. Tutaj chodzi o działanie pod spodem, czyli to co dzieję się w pamięci. Weźmy przykład poniżej tworzymy zmienną String x i przypisujemy jej literał „foo”. Przeanalizujmy co w rzeczywistości dzieje się w pamięci programu:
public static void main(String[] args) {
String x = "foo";
}

Gdy tworzymy zmienną x to ona w rzeczywistości jest wskaźnikiem adresu na zapisany w stercie String „foo”. String ten dokładniej trafia w obszar tzw. „String Pool” będący częścią sterty. Zobaczmy co się stanie przy utworzeniu nowej zmiennej String y i przypisaniu jej także „foo”:
public static void main(String[] args) {
String x = "foo";
String y = "foo";
}

Widzimy iż nie spowodowało to stworzenia znów Stringa „foo”, a zamiast tego zmienna y również wskazuje na ten sam obiekt w String Pool. Ta operacja pomaga nam zaoszczędzić miejsca w pamięci i nie byłaby możliwa, gdyby Stringi były mutowalne. Kolejny slajd wyjaśni dlaczego jest to tak ważne. Sprawdźmy sytuację gdy w zmiennej y zmienimy String z „foo” na „boo”:
public static void main(String[] args) {
String x = "foo";
String y = "foo";
y = "boo";
}

Jak można zauważyć tworzony jest nowy obiekt „boo”. Zmienna y przestaje wskazywać na „foo” a przestawia się teraz na „boo” dzięki temu wcześniej stworzona zmienna x wciąż wskazuje na „foo”. Gdyby obiekty String były mutowalne to podczas takiej operacji zmienna x przez przypadek zmieniłaby swoją wartość na „boo” co mogłoby stanowić spore zagrożenie w bezpieczeństwie programów.
Podsumowując trzy główne zalety tego iż Stringi są Immutable to:
- bezpieczeństwo programów, ponieważ nie możemy zmienić zawartości zmiennej w niekontrolowany sposób
- oszczędność pamięci, bo różne zmienne mogą wskazywać na ten sam String w pamięci sterty (String Pool)
- takie podejście jest także bezpieczne dla wielowątkowych programów