나는 종종 Java String 스 플라이 싱 및 인터넷의 다른 측면에 대한 토론을 보았습니다. 나는 다음과 같은 초보자 프로그래머에게 제안에서 일부 Java 개발자를 보았습니다.
+ 부호를 스플 라이스 스트링에 사용하지 말고 StringBuffer 또는 StringBuilder의 append () 메소드를 스플 라이스 문자열에 사용하십시오.
그러나 + 표지판을 사용하여 문자열을 스플 라이스로 만드는 것은 정말 성가신 일입니다. 스플 라이스 끈에 + 표시를 사용하는 데 좋은 것이 있습니까?
Java API 문서에서 문자열 클래스에 대한 몇 가지 내용을 찾아서 다음과 같은 스 니펫을 볼 수 있습니다.
"Java 언어는 문자열 연결 기호 ("+")에 대한 특별한 지원을 제공하고 다른 객체를 문자열로 변환합니다. 문자열 연결은 StringBuilder (또는 StringBuffer) 클래스와 그 부록을 통해 구현됩니다. 문자열 변환은 객체 클래스에 의해 정의되며 Java의 모든 클래스에서 상속 될 수 있습니다."
이 구절은 Java에서 + 부호 스 플라이 싱 스트링을 사용하는 것은 실제로 StringBuffer 또는 StringBuilder와 그 부속 방법에 의해 구현된다는 것을 분명히 알려줍니다.
Java API 문서 외에도 도구를 사용하여 클래스 파일의 바이트 코드 명령을보고 위의 답변을 얻을 수 있습니다. 예를 들어 코드 :
public static void main (String [] args) {문자열 a = "hello"; 문자열 b = "세계"; 문자열 str = a + b + "!"; System.out.println (str);} 도구를 통해 해당 바이트 코드를 보는 명령은 다음과 같습니다.
Bytecode 명령에서 우리는 우리가 쓴 다음 코드를 명확하게 알 수 있습니다.
문자열 str = a + b + "!";
다음과 유사한 진술로 전환되었습니다.
String str = new StringBuilder (string.valueof (a)). Append (b) .append ( "!"). toString ();
뿐만 아니라 Java 컴파일러는 비교적 스마트 컴파일러입니다. + 부호 스 플라이 싱이 모든 문자열 리터럴 일 때, Java 컴파일러는 컴파일하는 동안 전체 문자열로 지능적으로 변환합니다. 예를 들어:
public static void main (String [] args) {String str = "hello" + "world" + ", Java!"; System.out.println (str);} Java 컴파일러는 문자 그대로 이런 종류의 문자열을 직접 분류하여 컴파일 할 때 완전한 문자열로 변환합니다.
+ 부호로 연결된 문자열에 변수가 있더라도 Java 컴파일러는 전면 문자열 리터럴을 하나의 문자열로 병합합니다.
public static void main (String [] args) {String java = ", java!"; String str = "hello" + "World" + Java; System.out.println (str);}위에서, String str = str1 + str2 + str3 + str4와 같은 작업의 경우 한 번에 다중 문자열을 접합시키는 데 아무런 문제가 없음을 알 수 있습니다.
Java에서는 문자열 객체가 불변 (불변)입니다. 코드에서 특정 문자열 객체에 대한 여러 별칭을 만들 수 있습니다. 그러나 이러한 별칭의 참조는 동일합니다.
예를 들어, S1과 S2는 "droidyue.com"객체에 대한 별칭이며 별칭은 실제 객체에 대한 참조로 저장됩니다. 그래서 s1 = s2
문자열 s1 = "droidyue.com"; 문자열 s2 = s1; system.out.println ( "s1 및 s2는 동일한 참조 =" + (s1 == s2));
그리고 Java에서는 과부하 된 연산자가 문자열 스 플라이 싱과 관련이 있습니다. +,+=. 그 외에도 Java 디자이너는 다른 연산자에게 과부하를 허용하지 않습니다.
Java에서는 오버로드 된 유일한 연산자는 문자열 스 플라이 싱과 관련이 있습니다. +,+=. 그 외에도 Java 디자이너는 다른 연산자에게 과부하를 허용하지 않습니다.
우리 모두 알다시피, Java 1.4 이전에는 문자열 스티치를 사용하여 문자열을 연결할 수 있습니다. Java 1.5에서 시작하여 StringBuilder를 사용하여 스플 라이스 문자열을 사용할 수 있습니다. StringBuffer와 StringBuilder의 주요 차이점은 StringBuffer가 스레드-안전하고 줄의 다중 스레드 작업에 적합하다는 것입니다. StringBuilder는 스레드 안전이며 단일 스레드에서 문자열을 작동하는 데 적합합니다. 그러나 대부분의 문자열 스티치 작업은 단일 스레드에서 수행되므로 StringBuilder를 사용하는 것이 성능에 도움이됩니다.
Java 1.4 이전에, 컴파일러는 Stringbuffer를 사용하여 + 부호 스 플라이 싱 스트링을 사용하여 문자열을 처리합니다. Java 1.5에서 시작하여, 컴파일러는 StringBuilder를 사용하여 대부분의 경우 + 부호 스 플라이 싱 스트링으로 문자열을 처리했습니다.
JDK 1.4 환경에서 코드를 작성할 때 + 부호를 사용하여 여러 문자열이 한 번에 스 플라이 싱되는 위의 상황을 처리하는 것이 좋습니다. 이러한 방식으로 JDK가 1.5 이상으로 업그레이드되면 컴파일러는 자동으로 StringBuilder로 스플 라이스 문자열로 변환하여 문자열 스 플라이 싱의 효율을 향상시킵니다.
물론, 권장되는 + 부호 스 플라이 싱 스트링의 사용은 문에서 다중 문자열을 접합 할 때만 사용되는 것으로 제한됩니다. 여러 문으로 문자열을 연결하는 경우 StringBuffer 또는 StringBuilder를 사용하는 것이 좋습니다. 예를 들어:
public static void main (String [] args) {String java = ", java!"; 문자열 str = ""; str += "안녕하세요"; str += "세계"; str += Java; System.out.println (str);} 컴파일러의 컴파일 된 바이트 명령은 다음과 같습니다.
위의 그림에서, 우리는 각 + 부호 스 플라이 싱 문에 새로운 StringBuilder 객체를 만듭니다. 이 상황은 특히주기 조건에서 분명하므로 성능 손실이 비교적 커집니다. 따라서 StringBuffer 또는 StringBuilder를 사용하여 여러 문장에서 문자열을 처리하는 것이 좋습니다.
StringBuilder를 사용하여 가져온 최적화에 대해
또한 StringBuffer 또는 StringBuilder를 사용할 때 다음 방법을 사용하여 성능을 향상시킬 수 있습니다 (다음 코드는 StringBuilder를 예로 들어 StringBuffer를 사용합니다).
1. 최종 획득 된 문자열의 최대 길이를 예측하십시오.
StringBuilder 내부의 Char 배열의 기본 길이는 16입니다. 문자열을 추가 하고이 길이를 초과하면 StringBuilder는 내부 배열 용량을 확장하여 요구를 충족시킵니다. 이 과정에서 StringBuilder는 새롭고 대용량 용량 숯 어레이를 생성하고 원래 배열의 데이터를 새 배열로 복사합니다. 마지막으로 접합 된 문자열의 최대 길이를 대략 예측할 수 있다면 StringBuilder 객체를 만들 때 적절한 크기의 초기 용량을 지정할 수 있습니다. 예를 들어, 우리는 100 글자를 포함하는 문자열을 얻으려면 스플 라이스 a를 가져와야합니다. 다음 코드를 작성할 수 있습니다.
StringBuilder SB = New StringBuilder (100); for (int i = 0; i <100; i ++) {sb.append ( 'a');} system.out.println (sb);실제 조건에 따라 균형을 잡으려면 초기 용량에 적합한 스트링 빌더를 만듭니다.
2. 개별 문자의 경우 가능한 한 문자열 유형 대신 숯 유형을 사용하십시오.
때로는 문자열 다음에 한 문자를 추가해야하며 (예 : a), 현재로서는 가능한 한 많이 사용해야합니다.
sb.append ( 'a');
사용하는 대신 :
sb.append ( "a");