>  기사  >  Java  >  스트링버퍼와 스트링빌더의 차이점

스트링버퍼와 스트링빌더의 차이점

(*-*)浩
(*-*)浩원래의
2019-06-04 13:19:263433검색

Java를 사용하든 Android를 사용하든 이 문제는 피할 수 없습니다. 실제로 개발 과정에서 이 질문은 인터뷰에서 꼭 필요한 질문입니다. , 요약하겠습니다.

스트링버퍼와 스트링빌더의 차이점

StringBuffer와 StringBuilder의 차이점

StringBuffer와 StringBuilder의 메서드와 함수는 완전히 동일합니다. 단, StringBuffer의 메서드 대부분은 동기화된 키워드로 수정되므로 스레드로부터 안전하고 지원됩니다. 동시 작업, 멀티스레딩에 사용하기에 적합합니다. StringBuilder는 동시 작업을 지원하지 않으며 선형적으로 안전하지 않으며 다중 스레드에서 사용하기에 적합하지 않습니다. 새로 도입된 StringBuilder 클래스는 스레드로부터 안전하지 않지만 단일 스레드에서의 성능은 StringBuffer보다 높습니다. (추천 학습: JAVA 비디오 튜토리얼)

다음으로, 테스트 과정과 결과의 코드를 직접 붙여넣었는데, 한눈에 알 수 있습니다:

public class StringTest {
 
	public static String BASEINFO = "Mr.Y";
	public static final int COUNT = 2000000;
 
	/**
	* 执行一项String赋值测试
	*/
	public static void doStringTest() {
 
		String str = new String(BASEINFO);
		long starttime = System.currentTimeMillis();
		for (int i = 0; i < COUNT / 100; i++) {
			str = str + "miss";
		}
		long endtime = System.currentTimeMillis();
		System.out.println((endtime - starttime)
				+ " millis has costed when used String.");
	}
 
	/**
	* 执行一项StringBuffer赋值测试
	*/
	public static void doStringBufferTest() {
 
		StringBuffer sb = new StringBuffer(BASEINFO);
		long starttime = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			sb = sb.append("miss");
		}
		long endtime = System.currentTimeMillis();
		System.out.println((endtime - starttime)
				+ " millis has costed when used StringBuffer.");
	}
 
	/**
	* 执行一项StringBuilder赋值测试
	*/
	public static void doStringBuilderTest() {
 
		StringBuilder sb = new StringBuilder(BASEINFO);
		long starttime = System.currentTimeMillis();
		for (int i = 0; i < COUNT; i++) {
			sb = sb.append("miss");
		}
		long endtime = System.currentTimeMillis();
		System.out.println((endtime - starttime)
				+ " millis has costed when used StringBuilder.");
	}
 
	/**
	* 测试StringBuffer遍历赋值结果
	* 
	* @param mlist
	*/
	public static void doStringBufferListTest(List<String> mlist) {
		StringBuffer sb = new StringBuffer();
		long starttime = System.currentTimeMillis();
		for (String string : mlist) {
			sb.append(string);
		}
		long endtime = System.currentTimeMillis();
		System.out.println(sb.toString() + "buffer cost:"
				+ (endtime - starttime) + " millis");
	}
 
	/**
	* 测试StringBuilder迭代赋值结果
	* 
	* @param mlist
	*/
	public static void doStringBuilderListTest(List<String> mlist) {
		StringBuilder sb = new StringBuilder();
		long starttime = System.currentTimeMillis();
		for (Iterator<String> iterator = mlist.iterator(); iterator.hasNext();) {
			sb.append(iterator.next());
		}
 
		long endtime = System.currentTimeMillis();
		System.out.println(sb.toString() + "builder cost:"
				+ (endtime - starttime) + " millis");
	}
 
	public static void main(String[] args) {
		doStringTest();
		doStringBufferTest();
		doStringBuilderTest();
 
		List<String> list = new ArrayList<String>();
		list.add(" I ");
		list.add(" like ");
		list.add(" BeiJing ");
		list.add(" tian ");
		list.add(" an ");
		list.add(" men ");
		list.add(" . ");
 
		doStringBufferListTest(list);
		doStringBuilderListTest(list);
	}
 
}

실행 결과 보기:

2711 millis has costed when used String.
211 millis has costed when used StringBuffer.
141 millis has costed when used StringBuilder.
 I  like  BeiJing  tian  an  men  . buffer cost:1 millis
 I  like  BeiJing  tian  an  men  . builder cost:0 millis

As 위의 결과를 보면 멀티스레딩과 상관없이 String 객체를 사용할 경우(Count/100을 넣었습니다) 실행 시간이 다른 두 객체보다 길고 StringBuffer 객체를 사용할 때와 StringBuilder 객체를 사용할 때의 차이도 확연합니다. . 프로그램이 단일 스레드에서 실행 중이거나 스레드 동기화 문제를 고려할 필요가 없는 경우 스레드 안전성을 보장하려면 StringBuilder 클래스를 사용하는 데 우선 순위를 두어야 한다는 것을 알 수 있습니다.

아래 List의 테스트 결과에서 볼 수 있듯이 멀티스레딩에 대한 지원이 다른 점을 제외하면 두 클래스의 사용법과 결과에는 거의 차이가 없습니다.

더 많은 JAVA 관련 기술 기사를 보려면 JAVA 개발 튜토리얼 칼럼을 방문하여 알아보세요!

위 내용은 스트링버퍼와 스트링빌더의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.