StringBuffer와 StringBuilder의 비교

String과 StringBuffer의 차이를 비교하는 글을 많이 보셨을 뿐만 아니라 이 두 가지의 차이도 잘 아실 거라고 믿습니다. 그러나 자바5.0이 발표된 이후 우리의 비교 목록에는 대상이 하나 더 생길 것입니다. 이것이 바로 StringBuilder류입니다.스트링 클래스는 변하지 않는 클래스로 스트링에 대한 어떠한 변화도 새로운 스트링 대상의 생성을 초래할 수 있다.StringBuffer는 가변 클래스로 그 문자열에 대한 어떠한 변화도 새로운 대상이 생기지 않는다. 가변과 불변 클래스라는 대상은 이미 완비되었는데 왜 새로운 StringBuilder 클래스를 도입해야 합니까?모두가 이 의문을 가지고 있을 거라고 믿습니다. 저도 그렇습니다.다음은 이 종류를 도입한 원인을 살펴보자.
스트링과 스트링 버퍼를 비교하는 글이 왜 그렇게 많이 나오지?
문자열의 내용을 변경할 때 StringBuffer를 사용하면 더 좋은 성능을 얻을 수 있기 때문이다.더 좋은 성능을 얻기 위해서라면 스트링버퍼를 사용하면 가장 좋은 성능을 얻을 수 있을까?
정답은 노!
왜?
Think in Java를 읽고 HashTable와 HashMap의 차이점을 설명한 부분에 대해 익숙해지면 그 이유를 알 수 있을 것이다.네, 스레드 동기화를 지원하여 스레드의 안전을 확보하여 성능을 떨어뜨리는 문제입니다.HashTable는 라인이 안전합니다. 많은 방법은synchronized 방법입니다. HashMap은 라인이 안전하지 않지만, 단일 라인 프로그램에서 HashTable보다 성능이 높습니다.StringBuffer와 StringBuilder 클래스의 차이점도 여기에 있다. 새로 도입된 StringBuilder 클래스는 라인이 안전하지 않지만 단일 라인에서 StringBuffer보다 성능이 높다.만약 당신이 이것에 대해 그리 믿지 않는다면 아래의 예를 들어 보십시오.
package com.hct.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author: chengtai.he
 * @created:2009-12-9  09:59:57
 */
public class StringBuilderTester {
 private static final String base = " base string. ";
 private static final int count = 2000000;

 public static void stringTest() {
  long begin, end;
  begin = System.currentTimeMillis();
  String test = new String(base);
  for (int i = 0; i < count/100; i++) {
   test = test + " add ";
  }
  end = System.currentTimeMillis();
  System.out.println((end - begin)
    + " millis has elapsed when used String. ");
 }

 public static void stringBufferTest() {
  long begin, end;
  begin = System.currentTimeMillis();
  StringBuffer test = new StringBuffer(base);
  for (int i = 0; i < count; i++) {
   test = test.append(" add ");
  }
  end = System.currentTimeMillis();
  System.out.println((end - begin)
    + " millis has elapsed when used StringBuffer. ");
 }

 public static void stringBuilderTest() {
  long begin, end;
  begin = System.currentTimeMillis();
  StringBuilder test = new StringBuilder(base);
  for (int i = 0; i < count; i++) {
   test = test.append(" add ");
  }
  end = System.currentTimeMillis();
  System.out.println((end - begin)
    + " millis has elapsed when used StringBuilder. ");
 }

 public static String appendItemsToStringBuiler(List list) {
  StringBuilder b = new StringBuilder();

  for (Iterator i = list.iterator(); i.hasNext();) {
   b.append(i.next()).append(" ");
  }

  return b.toString();
 }

 public static void addToStringBuilder() {
  List list = new ArrayList();
  list.add(" I ");
  list.add(" play ");
  list.add(" Bourgeois ");
  list.add(" guitars ");
  list.add(" and ");
  list.add(" Huber ");
  list.add(" banjos ");

  System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
 }

 public static String appendItemsToStirngBuffer(List list) {
  StringBuffer b = new StringBuffer();

  for (Iterator i = list.iterator(); i.hasNext();) {
   b.append(i.next()).append(" ");
  }

  return b.toString();
 }

 public static void addToStringBuffer() {
  List list = new ArrayList();
  list.add(" I ");
  list.add(" play ");
  list.add(" Bourgeois ");
  list.add(" guitars ");
  list.add(" and ");
  list.add(" Huber ");
  list.add(" banjos ");

  System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
 }

 public static void main(String[] args) {
  stringTest();
  stringBufferTest();
  stringBuilderTest();
  addToStringBuffer();
  addToStringBuilder();
 }
}

위의 프로그램 결과는 다음과 같습니다. 5266 millis has elapsed when used String.  375 millis has elapsed when used StringBuffer.  281 millis has elapsed when used StringBuilder.I play Bourgeois guitars and Huber banjos I play Bourgeois guitars and Huber banjos는 위의 결과를 보면 이 세 가지 유형이 단일 스레드 프로그램에서의 성능 차이를 한눈에 알 수 있다. String 대상을 사용할 때 운행 횟수가 다른 대상의 1/100에 불과하더라도 집행 시간은 다른 대상보다 25배 이상 높다.StringBuffer 대상과 StringBuilder 대상의 차이도 비교적 뚜렷하다. 전자는 후자의 1.5배 정도이다.이를 통해 알 수 있듯이 만약에 우리의 프로그램이 단일 루트에서 실행되거나 루트 동기화 문제를 고려할 필요가 없다면, 우리는StringBuilder 클래스를 우선적으로 사용해야 한다.물론 라인의 안전을 확보하려면 스트링 버퍼가 아닐 수 없다.
다중 라인에 대한 지원이 다른 것을 제외하고 이 두 종류의 사용은 거의 차이가 없다. 위의 예는 바로 좋은 설명이다.appendItemsToStringBuiler와 appendItemsToStirngBuffer 두 가지 방법은 채택된 대상이 각각 StringBuilder와 StringBuffer인 것을 제외하고는 완전히 같고 효과도 완전히 같다.

좋은 웹페이지 즐겨찾기