String s = "hello";
String backup_of_s = s;
s = "bye";
이 시점에서 백업 변수는 여전히 원래 값 “hello”를 포함합니다 (이것은 String의 불변성 때문입니까?).
그러나이 방법으로 문자열을 복사 하는 것이 실제로 안전 합니까 (물론 일반 가변 객체를 복사하는 것이 안전하지 않습니까?) :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
다시 말해,이 두 코드 조각의 차이점은 무엇입니까?
편집-첫 번째 스 니펫이 안전한 이유 :
이미 제공된 좋은 답변 (기본적으로 2 개의 스 니펫 간의 성능 차이 문제에 중점을 두었습니다)을 기반으로 좀 더 자세히 설명하겠습니다.
Java에서는 문자열을 변경할 수 없습니다. 즉, 문자열 객체는 생성 후에 수정할 수 없습니다. 그 후,
String s = "hello";
새로운 String 인스턴스를 생성하고 주소를 s
( s
인스턴스 / 객체에 대한 참조) 할당
String backup_of_s = s;
새 변수를 backup_of_s
만들고 초기화하여 현재 참조하는 객체를 참조합니다 s
.
참고 : 문자열 불변성은이 객체가 수정되지 않도록 보장합니다. 백업은 안전합니다
참고 2 : Java 가비지 수집 메커니즘은이 객체가 하나 이상의 변수 ( backup_of_s
이 경우)에 의해 참조되는 한 파괴되지 않도록합니다.
마지막으로, s = "bye";
불변성 때문에 유일한 String 인스턴스 인 다른 String 인스턴스를 만들고 s
변수를 수정 하여 새 객체를 참조하도록합니다.
답변
문자열은 변경할 수 없으므로 두 버전 모두 안전합니다. 그러나 후자는 효율성이 떨어집니다 (추가 개체를 생성하고 경우에 따라 문자 데이터를 복사 함).
이를 염두에두고 첫 번째 버전이 선호됩니다.
답변
문자열은 불변의 객체 이므로 참조 된 객체를 변경할 수 없으므로 참조를 복사하여 복사 할 수 있습니다 …
따라서 문제없이 첫 번째 예제에서와 같이 복사 할 수 있습니다.
String s = "hello";
String backup_of_s = s;
s = "bye";
답변
두 번째 버전은 단순히 그렇게 할 필요가 없을 때 추가 문자열 객체를 생성하기 때문에 효율성이 떨어집니다.
불변성은 첫 번째 버전이 예상 한대로 동작하므로 선호되는 방식입니다.
답변
두 번째 경우는 문자열 풀 측면에서 비효율적이므로 반환 참조에서 intern ()을 명시 적으로 호출하여 인턴으로 만들어야합니다.
답변
String str1="this is a string";
String str2=str1.clone();
이런 복사는 어떻습니까? 새로운 사본을 얻는 것이 더 좋습니다. 따라서 추가 데이터에서 참조되고 수정 str1
될 때 데이터에 영향을 미치지 않습니다 str2
.