2012-01-22 3 views
22

+ 대 CONCAT 대 추가,하지만 다음과 같은 경우에 궁금 : 사용하는 것이 가장 좋습니다는 다시 한번 문자열을 내가 분할 머리를 생각 할 수

String newString = a + b + c; //case 1 


String newString = a.concat(b).concat(c); //case 2 

StringBuilder newString = new StringBuilder(); //case 3 
newString.append(a); 
newString.append(b);  
newString.append(c); 

?

가장 좋은 의미는 어쨌든입니다. 이들에 대한 읽기

, 다른 게시물

더 구체적으로 다른 경우 1 등의 경우 3 년에 종료됩니다, 케이스 (3)가 최적의 성능을 현명 아니라고 말한다.

예를 들어, 코드를 유지해야하는 경우 다른 스타일의 프로그래머가 어떤 스타일로 볼 수 있습니까?

프로그래밍을 더 효율적으로 생각하십니까?
또는 더 빠른 것 같아요.

어떻게 표현해야할지 모르겠습니다.

사례 3은 더 빠를 수 있지만 대다수의 프로그래머는 사례 1을 선호합니다. 왜냐하면 가장 잘 읽을 수 있기 때문입니다. 어떻게 든 잘 구체화되면 받아 들여집니다.

+2

나는 downvote.I 마음을 많이하지 익명 downvote – Cratylus

+0

이 질문은 아마 다른 사람의 속임수입니다. (어느 누구도 속은 사람과 연결되어 있지 않다.) –

+0

@Cratylus, Wish 나는 너의 덧글을 계속해서 upvote 할 수있다. 하지만 누가 신경 써, 그렇게 익명 downvotes 없이는 아니에요. – 3bdalla

답변

19

사례 1, 간결 명확하게 의도를 표현하고, 경우에 해당 3.

사례 2는 덜 효율적이며 읽기 쉽지 않습니다.

사례 3은 사례 1보다 효율적이지만, 길고 읽기 쉽지 않습니다.

사례 3을 사용하는 것은 루프에서 연결해야 할 때만 사용하는 것이 좋습니다. 그렇지 않으면 컴파일러는 케이스 1을 케이스 3 (단, new StringBuilder(a)으로 StringBuilder를 생성한다는 점을 제외하고)을 컴파일하므로 케이스 3보다 훨씬 효율적입니다.

+2

+1 : 사례 2는 다른 사례와 마찬가지로 하나의 임시 객체를 생성하므로 효율성이 떨어지지 만 가장 명확하지는 않은 것으로 동의합니다. (부분적으로 사용되기 때문에 공통점이 있습니다.) –

+0

연결하려는 문자열이 3 개뿐이기 때문에 임시 객체가 1 개 있습니다 (실제로 문자 배열을 계산하면 2 개입니다). 문자열을 더 추가하면 문자열 당 임시 객체가 하나 더 생깁니다. –

+1

동의하면 확장되지 않습니다. 'a.concat (b)'에 대해서는 실제로 약간 더 좋습니다. –

2

사례 3은 대부분의 측면에서 더 우수합니다. 케이스 3에서는 3 개의 문자열 객체를 생성하지 않아도됩니다. 문자열 불변성으로 인해 2는 각 + (또는) 연결에 대한 문자열 개체를 만드는 오버 헤드를 갖게됩니다.

편집 : 문서를 다시 읽고 대부분의 의견에 동의하십시오. 사례 1은 사례 3입니다. 이 경우 1로 읽을 수없는 등의 경우 3대로 수행되지,

+0

그리고 대개 성능이 중요한 곳에서 텍스트 조작을 할 때, (a) 훨씬 더 많은 작업량으로 작업하고 있습니다. (b) 텍스트 검색 및 삽입 또는 삭제와 같은보다 복잡한 작업. – user268396

+2

최신 JVM은 런타임에 케이스 1을 케이스 3으로 변환하므로 3 개의 String 오브젝트가 없습니다. 그러나 순차적 인 연결이 (다른 명령문에서) 또는 루프에있는 경우, 예 각각의 명령문은 새로운 불변 ​​문자열을 작성합니다. –

+0

감사합니다 아미르! 동의하고 업데이트했습니다. – kosa

7

사례 3은 가장 성능 형태이지만, JVM이 경우 3.

에 경우 1 변환하지만 사건이 최악이라고 생각

루프에서 문자열을 concat 그냥 사용하려는 경우에는 쉽게 성능을 테스트 할 수 있지만 루프에 없거나 시퀀스에 많은 문자열을 추가하지 않는 경우 거의 같다. 당신은 + 연산자를 사용하지 않는다

사례는 다음과 같습니다

String a = ""; 
for (String x : theStrings) { 
    a += x; 
} 

또는

String a = b + c; 
a = a + d; 
a = a + e; 
a = a + f; 
1

간단한 경우에 대해 +을 사용하는 것이 더 분명합니다.

좀 더 복잡한 경우에는 StringBuilder이 적합합니다. 줄을 가로 질러 갈라지는 경우에는 +이 빠르게 성능 드래그가 될 수 있습니다. n이 작 으면 문제가되지 않지만 어색한 환경에서는 n이 커질 수 있습니다 (어쩌면 중요한 일을 할 때 또는 누군가가 악의적 인 것입니다.)

다른 답변과는 달리, 문자열이 3 개인 경우 concat이 실적을 올린 것일 수 있습니다. 나는 정신적 인가요? 다른 두 가지 옵션을 고려하십시오. 배열을 사용하여 StringBuilder 개체를 만듭니다. 문자열을 추가하면 배열을 대체해야 할 수도 있습니다. 배열 끝 부분에 홀수 비트가 남아있을 수 있습니다.이 경우 할당에 대한 세부 묘사가 있으므로 여분의 메모리가 증가 할 수도 있고 늘지 않을 수도 있습니다 (char). 코드를 읽는 모든 사람을 싫어하면 필요한 용량을 계산할 수 있습니다. 가장 좋은 경우 결과 텍스트와 두 개의 다른 객체 (StringBuilderString)의 크기 각각 두 개의 배열 (StringBuilder, 하나는 String (지난 8 년간 공유 없음)). 이제 concat의 경우 두 개의 배열을 가진 String 개체에 할당하려고합니다. 그러나 첫 번째 배열의 길이는 c.length()입니다. 그것은 승리입니다! 음, 가독성을 위해 아닙니다.

면책 조항 : JVM은 이스케이프 분석 후 스택 할당과 코어 클래스의 특수 케이스를 포함하여 와일드 최적화를 수행 할 수 있습니다. 그들은 손에 혼란스런 코드보다 일반적이고 간단한 코드를 최적화 할 가능성이 더 큽니다.

관련 문제