문자열 A와 B를 가정합니다.
a += b
a = a.concat(b)
후드 밑에, 그들은 같은 것입니까?
여기에 참조로 디 컴파일 된 Concat입니다. +
연산자를 삭제할 수도뿐만 아니라 그 작업자를 확인하고 싶습니다.
public String concat(String s) {
int i = s.length();
if (i == 0) {
return this;
}
else {
char ac[] = new char[count + i];
getChars(0, count, ac, 0);
s.getChars(0, i, ac, count);
return new String(0, count + i, ac);
}
}
해결 방법
아니, 꽤 아니야.
첫째, 의미론에서 약간의 차이가 있습니다. a
가 null
인 경우 a.concat (b)
는 nullPointerException
을 던졌지만 a + = b를 던졌습니다.
는 a
의 원래 값을 null
처럼 처리합니다.또한 costat ()
메소드는 +
연산자가 +
연산자가 인수를 문자열로 변환하는 동안 문자열
값만을 허용합니다 (<코드> 사용tostring () 객체에 대한 방법).따라서 concat ()
방법은 그것이 받아 들인 것에 더 엄격합니다.
후드 아래에서 보려면 a + = b;
로 간단한 클래스를 작성하십시오.
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
이제 javap -c
(Sun JDK에 포함)로 분해하십시오.다음을 포함하여 목록을보아야합니다.
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
따라서 a + = b
는 다음과 같습니다.
a = new StringBuilder()
.append(a)
.append(b)
.toString();
concat
메소드가 더 빨라야합니다.그러나 stringbuilder
메소드가 적어도 성능면에서이기는 더 많은 문자열을 사용합니다.
string
및 stringbuilder
(및 패키지 - 개인 기본 클래스)의 소스 코드는 Sun JDK의 src.zip에서 사용할 수 있습니다.최종 문자열
을 만들 때 char 배열을 빌드하고 char 배열을 구축 한 다음 멀리 던지는 것을 알 수 있습니다.실제로 메모리 할당은 놀랍게도 빠릅니다.
참조 페이지 https://stackoverflow.com/questions/47605
'자바' 카테고리의 다른 글
Java에서 Base64 데이터를 디코딩합니다 (0) | 2021.04.12 |
---|---|
Java에서 일반 텍스트 파일 읽기 (0) | 2021.04.11 |
Maven 프로젝트에 로컬 JAR 파일을 추가하는 방법은 무엇입니까? (0) | 2021.04.11 |
단일 문자가 문자열에 나타나는지 확인하려면 어떻게해야합니까? (0) | 2021.04.11 |
Java - 정수를 문자열로 변환합니다 (0) | 2021.04.11 |
댓글