String vs StringBuffer vs StringBuilder

kmb·2021년 8월 7일
0

자바

목록 보기
21/31
post-thumbnail

StringBuffer 클래스와 StringBuilder 클래스를 사용할경우 String 클래스에 비해 큰 속도차이를 보인다.

왜??
String은 할당공간이 변하지않아서 += 연산을 할경우 Heap 메모리 영역에 새로운 String 객체가 생성되고 기존의 String 객체는 참조하지 않게되어 가비지 컬렉션(GC)의 메모리 해제를 기다리게 되고 이는 프로그램 성능 저하로 이어진다.
StringBufferStringBuilder는 공간이 부족할 경우 자유자재로 버퍼크기를 늘릴수있다.

StringBuffer는 가변 동기(syn) 방식이므로 Thread Safe하다. Multi Thread 환경에서 변화되는 문자열일때 사용한다.
StringBuilder는 가변 비동기(asyn) 방식이므로 Thread safe 하지않지만 처리속도가 빠르다. Single Thread 환경에서 변화되는 문자열일때 사용한다.

가장 많이 사용되는 메서드는 .append( ) 이며 매개변수로 기본자료형 및 참조자료형을 모두 포함할 수 있다.

String a1 = "";	  
StringBuffer a2 = new StringBuffer("");
StringBuilder a3 = new StringBuilder("");
		
        
  long start1 = System.currentTimeMillis();
	for (int k=0; k<100000; k++) {
		a1+="hello";
  	}
  long end1 = System.currentTimeMillis(); 
		
        
  long start2 = System.currentTimeMillis();		
	for (int k=0; k<100000; k++) {
		a2.append("hello");
	}
  long end2 = System.currentTimeMillis();
		
        
  long start3 = System.currentTimeMillis();	
	for (int k=0; k<100000; k++) {
		a3.append("hello");
	}
  long end3 = System.currentTimeMillis(); 
			
            
System.out.println("k : " + (end1-start1));		
System.out.println("k : " + (end2-start2));
System.out.println("k : " + (end3-start3));		

결과는 다음과 같다.

String은 4.4초가 걸린반면 StringBuffer, StringBuilder는 각각 3ms, 1ms 밖에 걸리지않는다.

StringBuilder는 비동기화 구조여서 단일쓰레드 환경에서 사용가능하다.
1개의 메서드내에서 문자열을 생성하여 더할 경우에 사용.

StringBuffer는 동기화 구조여서 멀티쓰레드, 단일쓰레드 환경 둘다 사용가능하다.
어떤 문자열 처리를 위한 인스턴스변수에 여러 쓰레드가 동시에 접근할 경우에는 반드시 StringBuffer를 사용해야한다.

profile
꾸준하게

0개의 댓글