어떻게 자바에 천을 똑같이 복사해야 한다고?
String s = "hello";
String backup_of_s = s;
s = "bye";
이 시점에서, 백업 변수 여전히 원본 값"안녕하세요"(이 현악의 불변 때문에 있습니까?)가 포함되어 있습니다.
하지만 과연 이 메서드(그것은 물론 정기적으로 변할 수 있는 개체를 복사하기에 안전하지 않습니다)과 천을 복사하거나 이렇게 써는 것이 좋다 안전한가?:
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
그건 다른 말로, 이 두가지 정황 사이의 차이점( 있는 경우)?
편집-왜 첫번째 무리 없이 안전하게 되는 이유는.
나를 조금 더 세심한 것을 것들, 좋은 대답에 따라 이미(본질적으로 성능의 차이 문제에 대한 2가지 정황 사이에 집중되었다)제공 설명할까요.
천 자바 있는데, 이것은 String개체가 건설한 후 수정하지 않을 수 있다는 의미에서는 변경할 수 없습니다.이런 이유로,
String s = "hello";
그리고 그것의 주소를 할당합니다 새로운 String인스턴스를 만듭니다.s
(s
인스턴스/객체에 대한 참조가 되는 것)
String backup_of_s = s;
새로운 변수를 만듭니다backup_of_s
너무 커서는 개체가 현재에 의해 참조된를 참조하는 그리고 초기화하다.s
.
참고:String불역성 보장은 이 개체:우리의 백업 안전하다고 수정하지 않을.
주 2: Java 가비지 수집 메커니즘은 적어도 하나의 변수에 의해 참조되는 한 이 오브젝트가 파괴되지 않음을 보증합니다.backup_of_s
이 사건)에
마침내.s = "bye";
다른 String 인스턴스를 생성하여(불변성을 위해 이것이 유일한 방법)s
가변이 이제 새로운 개체를 참조합니다.
문자열은 불변하기 때문에 두 버전 모두 안전합니다.그러나 후자는 효율성이 떨어집니다(추가 개체가 생성되고 경우에 따라 문자 데이터가 복사됩니다).
이 점을 고려하여 첫 번째 버전을 선호해야 합니다.
문자열은 불변의 오브젝트이므로 참조되는 오브젝트는 변경할 수 없기 때문에 참조에 대응하는 것만으로 복사할 수 있습니다.
따라서 첫 번째 예시와 같이 문제없이 복사할 수 있습니다.
String s = "hello";
String backup_of_s = s;
s = "bye";
두 번째 버전은 추가 문자열 개체를 생성할 필요가 없는 경우에 생성하기 때문에 효율성이 떨어집니다.
불변성은 첫 번째 버전이 예상대로 동작하므로 선호되는 접근 방식임을 의미합니다.
두 번째 케이스는 String 풀에서도 비효율적입니다.인턴하려면 리턴 레퍼런스에 intern()을 명시적으로 호출해야 합니다.
String str1="this is a string";
String str2=str1.clone();
렇게복 복사 ?사 ???더 생각하기 에, 그 를 입수하는 것이 좋다고 생각을 합니다. 그래서 그 데이터는str1
을 str2
미래 액션에서 참조되고 수정됩니다.
언급URL : https://stackoverflow.com/questions/10607990/how-should-i-copy-strings-in-java
'programing' 카테고리의 다른 글
열거형 요소 수 (0) | 2022.07.12 |
---|---|
C 프로그램에서 X코드로 명령줄 인수 제공 (0) | 2022.07.12 |
비트 필드에 값을 할당해도 동일한 값이 반환되지 않는 이유는 무엇입니까? (0) | 2022.07.12 |
Vue에서 임의 슬롯 액세스 (0) | 2022.07.12 |
대규모 웹 사이트의 Vuex 스토어 아키텍처 (0) | 2022.07.12 |