모범 사례가 무엇이며 다른 경우에 문자열 리터럴과 변수를 연결하는 이유를 이해하려고합니다. 예를 들어 다음과 같은 코드가 있으면
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String).append("CCCCCCCCCCC").append(D_String)
.append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
이것이 그렇게하는 방법입니까? 에서 이 게시물에 , 나는 것으로 나타났습니다 +
문자열에 운영자가, 모두 StringBuilder의 새로운 인스턴스를 생성 피연산자를 연결 한 후 바로 호출하는 것보다 더 많은 작업처럼 보이는 문자열 변환을 반환 .append()
; 그래서 그것이 사실이라면 그것은 의문의 여지가 없습니다. 하지만 String.concat()
어떨까요? .append()
모든 연결 에 사용 하는 것이 적절 합니까? 또는 변수에 대해서만, 리터럴은 .concat()
?
StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
.append(B_String.concat("CCCCCCCCCCC")).append(D_String
.concat("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
.concat("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));
이러한 상황에 대처하기위한 모범 사례 및 성능에 대한 일반적인 규칙은 무엇입니까? 내 가정이 정확 +
하고 실제로 사용해서는 안됩니까?
답변
+
운영자
String s = s1 + s2
뒤에서 이것은 다음으로 번역됩니다.
String s = new StringBuilder(s1).append(s2).toString();
s1 + s2
여기에 추가 작업이 얼마나 추가되는지 상상해보십시오 .
stringBuilder.append(s1 + s2)
대신에:
stringBuilder.append(s1).append(s2)
여러 문자열 +
다음 사항에 유의할 가치가 있습니다.
String s = s1 + s2 + s3 + ... +sN
다음으로 번역됩니다.
String s = new StringBuilder(s1).append(s2).append(s3)...apend(sN).toString();
concat()
String s = s1.concat(s2);
String
생성 char[]
모두 들어갈 수 배열 s1
및 s2
. 복사 s1
및 s2
이 새로운 배열에 내용을 표시합니다. 실제로 +
운영자 보다 적은 작업이 필요합니다 .
StringBuilder.append()
char[]
필요할 때 확장 되는 내부 어레이를 유지 합니다. char[]
내부가 충분히 크면 추가 로 생성 되지 않습니다 .
stringBuilder.append(s1.concat(s2))
s1.concat(s2)
추가 char[]
배열과 복사본을 s1
만들고 s2
내부에 새 배열 내용을 복사 하기 때문에 성능이 저하 StringBuilder
char[]
됩니다.
즉 append()
, 항상 사용하고 원시 문자열을 추가 해야합니다 (첫 번째 코드 스 니펫이 정확함).
답변
컴파일러는 + 연결을 최적화합니다.
그래서
int a = 1;
String s = "Hello " + a;
로 변형됩니다
new StringBuilder().append("Hello ").append(1).toString();
+ 연산자를 사용해야하는 이유를 설명 하는 훌륭한 주제가 여기에 있습니다 .
답변
최적화는 컴파일러에 의해 자동으로 수행됩니다.
Java2 컴파일러는 다음을 자동으로 변환합니다.
String s = s1 + s2;
…에
String s = (new StringBuffer()).append(s1).append(s2).toString();
Oracles 웹 사이트 의 Java Best Practices 에서 바로 가져옵니다 .
답변
항상 append
.
concat
새 문자열을 만들어 제 +
생각 과 비슷 합니다.
두 개의 최종 문자열을 concat
사용하거나 사용 +
하면 JVM이 최적화를 수행 할 수 있으므로이 경우 추가하는 것과 동일합니다.
답변
정확히 두 개의 문자열을 연결하는 경우 String.concat을 사용합니다 (두 문자열에 맞는 새 문자 배열을 만들고 두 문자열의 문자 배열을 여기에 복사하여 새 문자열을 만듭니다).
여러 문자열을 한 줄에 연결하는 경우 + 또는 StringBuilder.append를 사용하면 컴파일러가 +를 StringBuilder.append로 변환하므로 중요하지 않습니다. 필요에 따라 증가하는 하나의 char 배열을 유지하기 때문에 여러 문자열에 유용합니다.
여러 줄에 걸쳐 여러 문자열을 연결하는 경우 하나의 StringBuilder를 만들고 append-method를 사용합니다. 결국 StringBuilder에 String을 추가하면 .toString () 메서드를 사용하여 String을 만듭니다. 여러 줄로 연결하는 경우 두 번째 방법이 두 번째 방법보다 빠릅니다. 두 번째 방법은 각 행에 새 StringBuilder를 만들고 문자열을 추가 한 다음 다시 String으로 캐스팅하는 반면 세 번째 방법은 전체에 대해 하나의 StringBuilder 만 사용하기 때문입니다.
답변
+
연산자 사용 이 모범 사례이며 간단하고 읽기 쉽습니다.
Java 언어는 문자열 연결 연산자 (+) 및 다른 객체를 문자열로 변환하는 특수 지원을 제공합니다. 문자열 연결은 StringBuilder (또는 StringBuffer) 클래스와 그 append 메소드를 통해 구현됩니다.
공식 문서 : https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
답변
바이트 코드 수준에서 다르지 않으며 우리는 거기에서 효율성을 손상시키지 않습니다. 바이트 코드 수준을 실행하는 경우 append를 호출하여 +에 대한 비 인라인 연산자 오버로딩 방법을 거쳐야합니다. 그런 다음 어셈블리 언어 수준에서 (Java는 C로 작성되고 C는 어셈블리와 유사한 어셈블리를 생성합니다. 스택에 + 메서드 호출을 저장하기위한 추가 레지스터 호출이 있으며 추가 푸시가 있습니다. 실제로 크로스 컴파일러는 + 연산자를 최적화 할 수 있습니다. 전화,이 경우 효율성에 차이가 없습니다.)
가독성을 높이는 한 가지 방법을 사용하는 것이 좋습니다. 🙂
