StringBuffer 대 문자열

Java는 StringBufferString클래스를 제공하며 String클래스는 변경할 수없는 문자열을 조작하는 데 사용됩니다. 간단히 말해, 유형의 객체 String는 읽기 전용이며 변경할 수 없습니다. StringBuffer클래스는 수정 될 수있는 문자를 나타내는 데 사용됩니다.

이 두 클래스 간의 중요한 성능 차이는 단순 연결을 수행 할 StringBuffer때보 String다 빠르다는 것 입니다. 에서 String조작 코드, 문자열은 일상적으로 연결됩니다. String클래스를 사용하여 연결은 일반적으로 다음과 같이 수행됩니다.

String str = new String ( "Stanford"); str + = "분실 !!";

StringBuffer동일한 연결을 수행하는 데 사용 하려면 다음과 같은 코드가 필요합니다.

StringBuffer str = 새로운 StringBuffer ( "Stanford"); str.append ( "분실 !!");

개발자는 일반적으로 append연결 방법을 사용하는 두 번째 예제 가 +연산자를 사용하여 두 String개체 를 연결 하는 첫 번째 예제보다 비용이 많이 든다고 생각하기 때문에 위의 첫 번째 예제가 더 효율적이라고 가정 합니다.

+운영자는 무죄 보이지만, 생성 된 코드는 약간의 놀라움을 생산하고 있습니다. StringBuffer연결을 위해를 사용하면 실제로 String. 이것이 왜 그런지 알아 보려면 두 예제에서 생성 된 바이트 코드를 조사해야합니다. 사용 예제의 바이트 코드는 String다음과 같습니다.

0 new # 7 3 dup 4 ldc # 2 6 invokespecial # 12 9 astore_1 10 new # 8 13 dup 14 aload_1 15 invokestatic # 23 18 invokespecial # 13 21 ldc # 1 23 invokevirtual # 15 26 invokevirtual # 22 29 astore_1 

위치 0에서 9까지의 바이트 코드는 코드의 첫 번째 줄에 대해 실행됩니다.

 String str = new String ( "Stanford"); 

그런 다음 위치 10에서 29까지의 바이트 코드가 연결을 위해 실행됩니다.

 str + = "분실 !!"; 

여기에서 상황이 흥미로워집니다. 연결을 위해 생성 된 바이트 코드는 StringBuffer객체를 생성 한 다음 해당 append메서드 를 호출합니다 . 임시 StringBuffer객체는 위치 10에서 생성되고 해당 append메서드는 위치 23에서 호출됩니다. String클래스는 변경 불가능 StringBuffer하므로 연결에 a를 사용해야합니다.

StringBuffer개체 에서 연결이 수행 된 후에는 다시 String. 이는 toString26 번 위치 에서 메서드를 호출하여 수행 됩니다.이 메서드 String는 임시 StringBuffer개체 에서 새 개체를 만듭니다 . 이 임시 StringBuffer개체를 만들고 그 이후에 String개체 로 다시 변환하는 데는 비용이 많이 듭니다.

요약하면 위의 두 줄의 코드는 세 개의 개체를 생성합니다.

  1. String위치 0에 있는 개체
  2. StringBuffer위치 10에 있는 개체
  3. String위치 26에 있는 개체

이제 다음을 사용하여 예제를 위해 생성 된 바이트 코드를 살펴 보겠습니다 StringBuffer.

0 new # 8 3 dup 4 ldc # 2 6 invokespecial # 13 9 astore_1 10 aload_1 11 ldc # 1 13 invokevirtual # 15 16 pop 

위치 0에서 9까지의 바이트 코드는 코드의 첫 번째 줄에 대해 실행됩니다.

 StringBuffer str = new StringBuffer ( "Stanford"); 

그런 다음 위치 10에서 16까지의 바이트 코드가 연결을 위해 실행됩니다.

 str.append ( "분실 !!"); 

첫 번째 예에서와 같이이 코드는 객체 의 append메서드를 호출 StringBuffer합니다. 그러나 첫 번째 예와 달리 임시 StringBuffer를 만든 다음 String개체 로 변환 할 필요가 없습니다 . 이 코드 StringBuffer는 위치 0에 하나의 객체 인을 만듭니다 .

결론적으로 StringBuffer연결은 String연결 보다 훨씬 빠릅니다 . 분명히 StringBuffers는 가능한 경우 이러한 유형의 작업에 사용되어야합니다. String클래스 의 기능 이 필요한 경우 StringBuffer연결을 위해를 사용한 다음 String.

Reggie Hutcherson은 썬 기술 전도사입니다. 그는 J2SE 및 HotSpot 성능 엔진에 중점을 둔 전 세계 Sun의 Java 2 플랫폼 기술을 전파합니다.

이 주제에 대해 더 알아보기

  • " JavaWorld, 새로운 주간 Java 성능 칼럼 데뷔"Reggie Hutcherson ( JavaWorld, 2000 년 3 월)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf.html

  • "Java 성능의 기초", Reggie Hutcherson ( JavaWorld, 2000 년 3 월)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html

  • "성능 문제 또는 디자인 문제?" Reggie Hutcherson ( JavaWorld, 2000 년 3 월)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html

  • "컴파일러 최적화,"Reggie Hutcherson ( JavaWorld, 2000 년 3 월)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html

이 이야기, "StringBuffer vs String"은 원래 JavaWorld에 의해 출판되었습니다.