String s = "hello";
String backup_of_s = s;
s = "bye";
W tym momencie zmienna zapasowa nadal zawiera oryginalną wartość „hello” (jest to spowodowane niezmiennością ciągu String, prawda?).
Ale czy naprawdę bezpiecznie jest kopiować ciągi za pomocą tej metody (co oczywiście nie jest bezpieczne, aby kopiować zwykłe zmienne obiekty), czy lepiej to napisać? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
Innymi słowy, jaka jest różnica (jeśli w ogóle) między tymi dwoma fragmentami?
EDYCJA - powód, dla którego pierwszy fragment jest bezpieczny:
Pozwólcie, że wyjaśnię to trochę bardziej szczegółowo, w oparciu o już udzielone dobre odpowiedzi (które zasadniczo koncentrowały się na kwestii różnicy wydajności między 2 fragmentami):
Ciągi są niezmienne w Javie, co oznacza, że obiektu String nie można modyfikować po jego budowie. W związku z tym,
String s = "hello";tworzy nową instancję String i przypisuje jej adres s( sbędący odwołaniem do instancji / obiektu)
String backup_of_s = s;tworzy nową zmienną backup_of_si inicjuje ją, aby odwoływała się do obiektu, do którego aktualnie się odwołuje s.
Uwaga: Niezmienność łańcucha gwarantuje, że ten obiekt nie zostanie zmodyfikowany: nasza kopia zapasowa jest bezpieczna
Uwaga 2: Mechanizm czyszczenia pamięci w Javie gwarantuje, że ten obiekt nie zostanie zniszczony, dopóki będzie do niego odwoływała przynajmniej jedna zmienna ( backup_of_sw tym przypadku)
Na koniec s = "bye";tworzy kolejną instancję String (ze względu na niezmienność, jest to jedyny sposób) i modyfikuje szmienną, aby teraz odwoływała się do nowego obiektu.