JAVA :: String, StringBuffer, StringBuilder 의 차이점
String, StringBuilder, StringBuffer 의 차이점에 대해서 알아보자
String은 immutable(불변) 으로 String 은 새로운 인스턴스를 생성 할 때 메모리에 할당 되며 다시 바꿀 수 없다.
문자열을 조작하거나 바꾸면 새로운 인스턴스를 반환해 준다.
StringBuffer, StringBuilder 는 mutable(변함) 이다. 즉 내부적으로 배열의 형태로 선언되기 문자열을 append 할 때 새로운 인스턴스를 할당 하지 않는다.
한번 생성 된 메모리에 append 하는 방식이다.
String
String str1 ="안녕 자바!"; System.out.println("str1 :"+str1.hashCode()); str11 = "잘가 자바!"; System.out.println("str1 :"+str1.hashCode());
결과1 : str1 :1804582026 결과2 : str1 :312564069
위와 같이 String 을 수정 하면 메모리가 새롭게 할당 된다.
이렇게 String이 더해지거나 수정되는 경우에는 각 String이 메모리에 할당되어 주소값이 stack에 쌓이고
클래스들은 가비지 컬렉터의 호출전까지 힙메모리에 계속 쌓이게 된다. 메모리에는 매우 안좋다.
메모리 관리적인 측면에서는 치명적이라고 볼 수 있다.
StringBuffer와 StringBuilder
StringBuilder 의 경우에는 쓰레드들이 동시에 접근 할 수 있으나 StringBuffer 의 경우 멀티쓰레드가 값을 변경 할 수 없게 하기 때문에
비동기 작업과 같은 것을 할 때는 StringBuffer 가 thread-safe 이기 때문에 멀티쓰레드 환경에서 더 좋다고 본다.
StringBuffer sb1 = new StringBuffer(); System.out.println("sb1 :"+sb1.hashCode()); sb1.append("안녕 문자열!"); System.out.println("sb1 :"+sb1.hashCode());
결과1 : sb1 :541161 결과2 : sb1 :541161
위에서 보는 것처럼 StringBuffer는 새로운 메모리를 할당하지 않고 메모리에 append하기 때문에 클래스를 생성하지 않는다.
개인적으로 StringBuffer 를 많이 쓴다 !