2012-12-10 2 views
13

가능한 중복 :
What is the purpose of the expression “new String(…)” in Java?String 클래스에 복사 생성자가있는 이유는 무엇입니까?

불변 클래스 사본이 원본과 동일 할 객체 경우이 왜 자바의 String 클래스는 복사 생성자가 무엇입니까? 실수입니까, 아니면 구현 이유가 있습니까? 자바 문서에서 이이 것을 지정됩니다

/** 
* Initializes a newly created {@code String} object so that it represents 
* the same sequence of characters as the argument; in other words, the 
* newly created string is a copy of the argument string. Unless an 
* explicit copy of {@code original} is needed, use of this constructor is 
* unnecessary since Strings are immutable. 
* 
* @param original 
*   A {@code String} 
*/ 
public String(String original) { 
.... 
....} 
+6

"너무 현지화되지 않았습니다."나중에 유용하게 찾을 수있는 유용한 질문입니다. 매우 유익하고 유익한 답변입니다. –

+3

[this] (http://stackoverflow.com/a/465682/1037210) 대답을 참조하십시오. – Lion

+0

언급 된 유사한 질문에 대한 대답은 이제 부분적으로 쓸모없는 것으로 간주 될 수 있습니다. –

답변

10

문자열 이다 복사하는 주된 이유 "수하물 트림", 즉, 필요한 경우에만 무엇인가에 대한 기본 문자 배열을 트림하는 것입니다.

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)을 사용하는 것이 가장 좋습니다. .

+5

... OpenJDK 7, Update 6에서 사라졌습니다.'substring','trim' 등을 통해 더 이상 구조적 공유가 없습니다. –

+0

@Marko 언급 한 업데이트 소스를 지적 할 수 있습니까? 나는 그 중요한 변화를 알지 못했다. –

+3

[여기에 참조] (http://hg.openjdk.java.net/jdk7u/jdk7u6/jdk/file/8c2c5d63a17e/src/share/classes/java/lang/String.java) 나는 그것을 북마크에 넣었습니다. 존 스켓 (Jon Skeet)으로부터 그 사실을 알게 된 이래로 인기있는 수요가되었습니다! –

관련 문제