java 라인 안전과 비 라인 안전 성능 비교

이것이 바로 StringBuilder 클래스입니다.스트링 클래스는 변하지 않는 클래스로 스트링에 대한 어떠한 변화도 새로운 스트링 대상의 생성을 초래할 수 있다.StringBuffer는 가변 클래스로 그 문자열에 대한 어떠한 변화도 새로운 대상이 생기지 않는다. 가변과 불변 클래스라는 대상은 이미 완비되었는데 왜 새로운 StringBuilder 클래스를 도입해야 합니까?      
문자열의 내용을 변경할 때 StringBuffer를 사용하면 더 좋은 성능을 얻을 수 있기 때문이다.더 좋은 성능을 얻기 위해서라면 스트링버퍼를 사용하면 가장 좋은 성능을 얻을 수 있을까?
정답은 노!
스레드 보안: HashTable, StringBuffer
비스레드 보안: HashMap, StringBuilder
성능 비교: 라인 동기화를 지원하여 라인 안전을 확보하기 때문에 성능이 떨어지는 문제.라인이 안전한 많은 방법은synchronized 방법이다.
예는 다음과 같습니다.
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 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();
 }
}

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

좋은 웹페이지 즐겨찾기