String vs StringBuffer vs StringBuilder
String
String은 내부적으로 char배열을 멤버로 갖고있는
래퍼클래스이다.
생성자를 통해 문자열 파라미터를 줘 객체를 생성하면
그 문자열을 바꿀 수 없다.
//String 클래스에 선언된 인스턴스 변수
private final char value[];
반면에 StringBuffer 클래스에서는 가능하다.
StringBuilder sb = new StringBuilder("abc");
StringBuilder sb2 = sb.append("123");
//두 객체의 참조값 비교
System.out.println(sb == sb2); //true
System.out.println(sb); //abc123
System.out.println(sb2); //abc123
append()메서드는 문자열을 추가한 뒤 자신의 참조값을 반환한다.
따라서 sb 와 sb2의 참조값(주소)가 같은 것이다.
StringBuffer 클래스는 생성자를 통해 char형 배열의 길이를 정할 수 있다.
기본 배열 길이(capacity) 는 16이다.
문자열 길이가 배열의 길이보다 길다면 ArrayList와 같이
새로운 배열을 생성해서 기존의 배열의 요소들을 복사한다.
StringBuffer sb = new StringBuffer();
//char형 배열의 길이를 출력
System.out.println(sb.capacity()); //16
//16보다 긴 문자열 추가
sb.append("qwertyuiasdjfkjkfgjdklll");
System.out.println(sb.capacity()); //34
StringBuffer 에는 equals()메서드가 오버라이딩되지 않았기 때문에
두 객체의 문자열만을 비교하려면 아래와 같이 한다.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb1 = new StringBuffer("abc");
//참조값을 비교한다
System.out.println(sb.equals(sb1)); //false
//문자열을 비교한다
System.out.println(sb.toString().equals(sb1.toString())); //true
StringBuffer의 소스 코드를 보면 모든 메서드가 동기화(synchronized)돼있다. 이는 멀티쓰레드 환경에서 안전하다는 것이다.
StringBuilder 는 StringBuffer 과 완전히 같은 기능을 갖는데
동기화만 뺀 것이다. 때문에 단일쓰레드환경에서 더 좋은 성능을 보인다.
Author And Source
이 문제에 관하여(String vs StringBuffer vs StringBuilder), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@cksdnr066/String-vs-StringBuffer-vs-StringBuilder저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)