Oznacza to, że po utworzeniu instancji obiektu nie możesz zmienić jego właściwości. W pierwszym alercie nie zmieniasz foo. Tworzysz nowy ciąg. Dlatego w drugim alercie wyświetli się „foo” zamiast oo.
Czy to oznacza, że wywołując metody na łańcuchu, zwróci zmodyfikowany ciąg, ale nie zmieni początkowego ciągu?
Tak. Po utworzeniu nic nie może zmienić łańcucha. Nie oznacza to, że nie możesz przypisać nowego obiektu łańcuchowego do str
zmiennej. Po prostu nie możesz zmienić bieżącego obiektu, do którego odwołuje się str.
Jeśli ciąg jest zmienny, czy to oznacza, że drugi alert () zwróciłby również oo?
Technicznie nie, ponieważ metoda podciągowa zwraca nowy ciąg. Zmodyfikowanie obiektu nie zmieniłoby metody. Zmienność oznacza, że technicznie rzecz biorąc, można by to zrobić tak, aby podciąg zmieniał oryginalny ciąg zamiast tworzyć nowy.
Na niższym poziomie niezmienność oznacza, że pamięć, w której przechowywany jest łańcuch, nie zostanie zmodyfikowana. Po utworzeniu łańcucha
"foo"
pewna ilość pamięci jest przydzielana do przechowywania wartości"foo"
. Ta pamięć nie zostanie zmieniona. Jeśli zmodyfikujesz łańcuch, powiedzmy,substr(1)
tworzony jest nowy łańcuch i przydzielana jest inna część pamięci, która będzie przechowywana"oo"
. Teraz masz w pamięci dwa ciągi"foo"
i"oo"
. Nawet jeśli nie zamierzasz"foo"
już używać , pozostanie, dopóki nie zostanie zebrany.Jednym z powodów, dla których operacje na strunach są stosunkowo drogie.
źródło
Niezmienny oznacza to, czego nie można zmienić ani zmodyfikować.
Więc kiedy przypisujesz wartość do ciągu, ta wartość jest tworzona od zera, a nie zastępowana. Tak więc za każdym razem, gdy nowa wartość jest przypisana do tego samego ciągu, tworzona jest kopia. Tak więc w rzeczywistości nigdy nie zmieniasz oryginalnej wartości.
źródło
Nie jestem pewien co do JavaScript, ale w Javie ciągi znaków stanowią dodatkowy krok w kierunku niezmienności dzięki „puli stałych ciągów”. Ciągi można konstruować za pomocą literałów ciągów (
"foo"
) lubString
konstruktora klasy. Ciągi zbudowane z literałów ciągów są częścią puli stałych ciągów, a ten sam literał ciągu będzie zawsze miał ten sam adres pamięci z puli.Przykład:
W powyższym, oba
lit1
ilit2
są zbudowane przy użyciu tego samego literału ciągu, więc wskazują na ten sam adres pamięci;lit1 == lit2
powodujetrue
, że są one dokładnie tym samym obiektem.Jednak
cons
jest konstruowany przy użyciu konstruktora klasy. Chociaż parametr jest tą samą stałą łańcuchową, konstruktor przydziela nową pamięćcons
, co oznacza, żecons
nie jest tym samym obiektem colit1
ilit2
, mimo że zawiera te same dane.Oczywiście, ponieważ wszystkie trzy łańcuchy zawierają te same dane znakowe, użycie
equals
metody zwróci wartość true.(Oczywiście oba typy konstrukcji strun są niezmienne)
źródło
Niezmienne oznacza, że wartości nie można zmienić. Raz utworzony obiekt typu string nie może być modyfikowany jako niezmienny. Jeśli zażądasz podłańcucha ciągu, zostanie utworzony nowy ciąg z żądaną częścią.
Używanie StringBuffer podczas manipulowania ciągami zamiast tego sprawia, że operacja jest bardziej wydajna, ponieważ StringBuffer przechowuje ciąg w tablicy znaków ze zmiennymi do przechowywania pojemności tablicy znaków i długości tablicy (ciąg w postaci tablicy znaków)
źródło
Podręcznikowa definicja zmienności podlega zmianom lub może podlegać zmianom. W programowaniu używamy tego słowa na oznaczenie obiektów, których stan może zmieniać się w czasie. Niezmienna wartość jest dokładnie odwrotna - po utworzeniu nigdy nie może się zmienić.
Jeśli wydaje się to dziwne, pozwolę sobie przypomnieć, że wiele wartości, których używamy przez cały czas, jest w rzeczywistości niezmiennych.
Myślę, że nikt nie będzie zaskoczony, gdy dowie się, że druga linia w żaden sposób nie zmienia ciągu w instrukcji. W rzeczywistości żadne metody łańcuchowe nie zmieniają łańcucha, na którym działają, wszystkie zwracają nowe ciągi. Powodem jest to, że łańcuchy są niezmienne - nie mogą się zmieniać, możemy tylko tworzyć nowe.
Ciągi nie są jedynymi niezmiennymi wartościami wbudowanymi w JavaScript. Liczby też są niezmienne. Czy możesz sobie w ogóle wyobrazić środowisko, w którym ocena wyrażenia 2 + 3 zmienia znaczenie liczby 2? Brzmi absurdalnie, ale robimy to cały czas z naszymi obiektami i tablicami.
źródło
Od strun do stosów ... prosty do zrozumienia przykład zaczerpnięty z bloga Erica Lipperta :
Znajdowanie ścieżki przy użyciu A * w C # 3.0, część druga ...
Aby dowiedzieć się więcej o niezmienności, przeczytaj posty Erica, zaczynając od tego:
Niezmienność w C # część pierwsza: rodzaje niezmienności
źródło
Jednym ze sposobów zrozumienia tej koncepcji jest przyjrzenie się, jak javascript traktuje wszystkie obiekty, czyli przez odniesienie. Oznacza to, że po utworzeniu instancji wszystkie obiekty są zmienne , oznacza to, że można dodać obiekt z nowymi metodami i właściwościami. Ma to znaczenie, ponieważ jeśli chcesz, aby obiekt był niezmienny, nie można go zmienić po utworzeniu wystąpienia.
źródło