본문 바로가기
자바

문자열 연결 : CONCAT () vs "+"연산자

by º기록 2021. 4. 11.
반응형

문자열 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

 

 

반응형

댓글