문자열 이다 복사하는 주된 이유 "수하물 트림", 즉, 필요한 경우에만 무엇인가에 대한 기본 문자 배열을 트림하는 것입니다.
substring
을 호출하여 문자열을 만들면 char 배열을 새 문자열 인스턴스와 소스 문자열 인스턴스간에 공유 할 수 있기 때문에 기본 char 배열이 주로 너무 클 수 있습니다. 첫 번째 문자와 길이를 가리키는 오프셋이 포함됩니다.
164 public String(String original) {
165 int size = original.count;
166 char[] originalValue = original.value;
167 char[] v;
168 if (originalValue.length > size) {
169 // The array representing the String is bigger than the new
170 // String itself. Perhaps this constructor is being called
171 // in order to trim the baggage, so make a copy of the array.
172 int off = original.offset;
173 v = Arrays.copyOfRange(originalValue, off, off+size);
174 } else {
175 // The array representing the String is the same
176 // size as the String, so no point in making a copy.
177 v = originalValue;
178 }
179 this.offset = 0;
180 this.count = size;
181 this.value = v;
이 많은 개발자들이 잊지 뭔가 작은 문자열을 방지 할 수 있기 때문에 중요하다
표현은 내가 "수하물 트림"사용은 문자열 복사 생성자의 소스 코드에서 가져온 것입니다 더 큰 문자 배열의 garbaging. 내가 이미 지적한이 관련된 질문을보십시오 : Java not garbage collecting memory. 많은 개발자들은 자바 프로그래머가 C 프로그래머에게 친숙한이 오래된 최적화 기법을 사용하는 결정보다 실제로는 좋지 않은 편이라고 생각합니다. 많은 사람들이 그 문제에 대해 알고 있었기 때문에 Sun의 소스 코드를 조사해야했기 때문에 많은 사람들이 그것을 알고 있습니다 ...
Marko가 지적한대로 (아래 주석 참조), OpenJDK에서는 Java 7 Update 6 substring
은 더 이상 char 배열을 공유하지 않으므로 String(String)
생성자는 쓸모가 없습니다. 하지만 그것은 여전히 빠릅니다 (실제로 더 빠릅니다). 그리고이 변화가 모든 VM (그리고 아마도 모든 고객이 아님)에게 전염되지 않았기 때문에, 이전의 행동이 그것을 정당화 할 때 new String(substring)
을 사용하는 것이 가장 좋습니다. .
"너무 현지화되지 않았습니다."나중에 유용하게 찾을 수있는 유용한 질문입니다. 매우 유익하고 유익한 답변입니다. –
[this] (http://stackoverflow.com/a/465682/1037210) 대답을 참조하십시오. – Lion
언급 된 유사한 질문에 대한 대답은 이제 부분적으로 쓸모없는 것으로 간주 될 수 있습니다. –