Jak powinienem skopiować Strings w Javie?

    String s = "hello";
    String backup_of_s = s;
    s = "bye";

W tym momencie zmienna zapasowa nadal zawiera oryginalną wartość „witaj” (jest to spowodowane niezmiennością ciągu znaków?).

Ale czy to naprawdę jestbezpieczny kopiować łańcuchy za pomocą tej metody (co oczywiście nie jest bezpieczne, aby skopiować zwykłe zmienne obiekty), lub lepiej jest napisać to? :

    String s = "hello";
    String backup_of_s = new String(s);
    s = "bye";

Innymi słowy, jaka jest różnica (jeśli taka istnieje) między tymi dwoma fragmentami?

EDIT - powód, dla którego pierwszy fragment kodu jest bezpieczny:

Pozwólcie, że wyjaśnię to nieco bardziej szczegółowo, w oparciu o już udzielone dobre odpowiedzi (które zasadniczo skupiały się na kwestii różnicy wydajności między dwoma fragmentami):

Ciągi są niezmienne w Javie, co oznacza, że ​​obiekt String nie może być modyfikowany po jego konstrukcji. Stąd,

String s = "hello"; tworzy nową instancję String i przypisuje jej adres dos (s będący odwołaniem do instancji / obiektu)

String backup_of_s = s; tworzy nową zmiennąbackup_of_s i inicjalizuje go tak, aby odwoływał się do obiektu, do którego obecnie odwołuje sięs.

Uwaga: Niezmienność ciągu gwarantuje, że ten obiekt nie zostanie zmodyfikowany: nasza kopia zapasowa jest bezpieczna

Uwaga 2: Mechanizm zbierania śmieci Java gwarantuje, że ten obiekt nie zostanie zniszczony, o ile będzie do niego odwoływać się co najmniej jedna zmienna (backup_of_s w tym przypadku)

Wreszcie,s = "bye"; tworzy inną instancję String (z powodu niezmienności, jest to jedyny sposób) i modyfikujes zmienna tak, że teraz odwołuje się do nowego obiektu.

questionAnswers(5)

yourAnswerToTheQuestion