그런 다음 가비지 수집이 발생하지 않는다고 가정 할 때이 프로그램에서 생성 할 문자열 수를 묻습니다. n = 3에 대한 내 생각은 (7)
문자열 1 ( ""
)과 2 ( "a"
)는 프로그램의 상수이며, 이것들은 사물의 일부로 생성되지 않지만 컴파일러가 알고있는 상수이기 때문에 '통합'됩니다. 이에 대한 자세한 내용 은 Wikipedia의 String interning 에서 확인하십시오.
또한 "a"
문자열 # 2 와 동일 하므로 문자열 5와 7을 카운트에서 제거합니다 . 문자열 # 3, # 4 및 # 6이 남습니다. 답은 코드를 사용하여 "n = 3에 대해 3 개의 문자열이 생성됩니다"입니다.
n = 3 일 때 n이 3이되기 때문에 n 2 의 개수 는 분명히 잘못되었습니다. 최악의 경우는 7 일뿐입니다. 비 인턴 문자열이 정확하면 답 은 2n + 1 이어야합니다 .
그래서 어떻게 해야 합니까?
문자열은 변경할 수 없기 때문에 새로운 객체를 만들지 않고 변경할 수있는 변경 가능한 것을 원합니다. 이것이 StringBuilder 입니다.
가장 먼저 볼 것은 생성자입니다. 이 경우 우리는 문자열의 길이를 알고, StringBuilder(int capacity)
필요한만큼 정확하게 할당 하는 생성자 가 있습니다.
다음 "a"
으로 String 일 필요는 없지만 character 일 수 있습니다 'a'
. 이 호출 할 때 밀어주는 약간의 성능이 append(String)
대를 append(char)
- (가)와 append(String)
,이 방법은 문자열이 얼마나 오래 알아 내고 그 몇 가지 작업을 할 필요가있다. 반면에 char
항상 정확히 한 문자 길이입니다.
코드 차이는 StringBuilder.append (String) vs StringBuilder.append (char) 에서 확인할 수 있습니다 . 아니고 무엇인가를 할 너무 관심, 그러나 당신이 고용주에게 좋은 인상을하려는 경우는 최선의 방법을 사용하는 것이 가장 좋습니다.
그래서 이것을 정리하면 어떻게 보일까요?
public String foo(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append('a');
}
return sb.toString();
}
하나의 StringBuilder와 하나의 문자열이 작성되었습니다. 추가 문자열을 삽입 할 필요가 없습니다.
Eclipse에서 다른 간단한 프로그램을 작성하십시오. pmd를 설치 하고 작성한 코드에서 실행하십시오. 그것이 무엇에 대해 불평하고 그 문제를 해결하십시오. 그것은 루프 +와 문자열의 수정을 발견 한 것입니다, 당신은 StringBuilder에 해당를 변경 한 경우, 그것은 것입니다 아마 초기 용량을 찾았지만 확실히 차이를 잡을 것입니다 .append("a")
및.append('a')