StringBuffer와 StringBuilder의 비교
4492 단어 문자열StringBuilderStringBuffer
스트링과 스트링 버퍼를 비교하는 글이 왜 그렇게 많이 나오지?
문자열의 내용을 변경할 때 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인 것을 제외하고는 완전히 같고 효과도 완전히 같다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
비슷한 이름의 Attribute를 많이 만들어 삭제하는 Houdini사용 소프트웨어는 Houdini16.5입니다 배열에서는 애트리뷰트의 보간이 잘 동작하지 않는 것과 AttributeCreateSOP 노드에서 Size가 4를 넘는 애트리뷰트를 작성해도 값이 조작할 수 없어 의미가 없...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.