Dlaczego te Stringi są Immutable?

wpis w: Blog | 0

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