2013-02-13 2 views
1

이것은 Java String 101 비트입니다.이 코드는 최근에 기존 코드에서 발견되었습니다. 내 첫 반응이 심지어이 될 것이라고 내 의견 에서불필요한 문자열 객체 만들기

car.setDetails(new String(someStringBufferObj.toString)); 

중복이다 ... 중복

car.setDetails(new String(someOtherStringObj)); 

위험이 절대 노출되지 않도록 문자열은 불변이기 때문에

자동차 세부 것이라고 다음 코드 줄에서 우연히 ( someOtherStringObj을 변경하여) 변경해야합니다.

내가 잘못 했습니까?

+2

네가 옳다. 'someOtherString'이'String' 만 제공된다면,이 스 니펫은 모두 불필요한 문자열을 만드는 것입니다. –

+0

반드시 그렇지는 않습니다. 나는 다시 동의한다. 예 1은 재실행하지 않습니다. 예 2. 내 대답을 아래에서보십시오 –

답변

2

위의 첫 번째 코드는 필요하지 않습니다. 그러나 두 번째가 필요할 수도 있습니다. 다음을 고려하세요.

생성자 String(String)복사본 원본 문자열의 기본 문자 배열을 사용하므로 유용합니다.

왜 유용합니까? 문자열 객체에는 문자 배열이 있고, 기존 문자열의 substring()을 얻는 것은 실제로 원래의 문자 배열을 사용한다는 것을 이해해야합니다. 이것은 flyweight pattern입니다. 다음

String s = longstring.substring(2,4); 

문자열을 longstring (다소 unintuitively) 기본 문자 배열에 s 사항을 고려하십시오. longstring (가비지 수집 사용)을 빈 저장소로 사용하려는 경우 s이 여전히 참조하므로 기본 문자 배열 에 저장되지 않으므로 2 문자 문자열에 대해 잠재적으로 막대한 양의 메모리를 소비하게됩니다.

String(String) 생성자는 생성자로 사용 된 문자열에 의해 참조 된 문자 배열에서 새 문자 배열을 생성하여이를 해결합니다. 원래 문자열이 가비지 수집을 통해 제거되면 해당 문자 배열은 substring() 결과에 의해 참조되지 않으므로 제거됩니다.

자바 (릴리스 7u4, 나는 생각합니다)에서이 동작이 매우 최근에 변경되었으며 문자열은 더 이상 위의 작업 모드를 지원하지 않습니다.

+0

그리고 유용 할 때마다 그것이 중복되는 것 같지 않습니다. 그 단어가 완전히 다른 것을 다루지 않습니까? – Joetjah

+0

좋은 답변 thanks Brian –

0

당신은 절대적으로 옳습니다. 롭,이 경우에는 문자열을 새로 만들 필요가 없습니다. 그냥 someStringBufferObj.toString()에 대한 호출을 제공하면 충분합니다.

+0

'someStringBufferObj'! ='someOtherStringObj' – PermGenError

+0

@PremGenError. 그는 아마도 첫 번째 스 니펫을 언급하고있을 것입니다. –