String, StringBuffer, StringBuilder 는 문자형 클래스로 문자열을 저장하고, 관리하는 클래스이다.
String과 StringBuffer, StringBuilder의 가장 큰 차이점은 String 은 불변(immutable), StringBuffer, StringBuilder 는 가변(mutable)이다.
String에서 문자열을 더하는(?) 방법은 .concat(), + "" 과 같은 방법이 있다고 생각할 수 있지만,
원래 값이 할당 되어 있던 메모리 영역은 GC에 의해 사라지고 새로운 값이 새로운 메모리 영역에 할당 되는 것이다.
불면(immutable)이기 때문에 문자열을 수정하는 순간 새로운 String 인스턴스가 생성된 것이다.
때문에 문자열이 변경이 많이 일어나는 경우에 StringBuffer, StringBuilder 메서드를 사용한다.
Buffer(데이터 공간) 크기의 기본값은 16개의 문자를 저장할 수 있고, 생성자를 통해 원하는 크기를 설정할 수 있다.
또한, 할당된 크기를 넘어서면 자동으로 Buffer의 크기가 커진다. 하지만 효율이 떨어지겠지 ?
sb.capacity(); //StringBuffer 변수의 배열 용량의 크기를 반환한다.
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
✨ String을 StringBuffer/StringBuilder로 바꾸는 방법
String str1 = "안녕하세요";
StringBuffer str2 = new StringBuffer(str1);
StringBuilder str3 = new StringBuilder(str1);
✨ StringBuffer/StringBuilder를 String으로 바꾸는 방법
StringBuffer sb1 = new StringBuffer("안녕하세요");
String str1 = String.valueOf(sb1);
✨ StringBuffer 클래스는 equals 메서드를 오버라이딩 하지 않는다.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb == sb2); // false
System.out.println(sb.equals(sb2)); // false
toString()은 오버라이딩 되어있다.
→ StringBuffer 인스턴스에 담긴 문자열을 비교하기 위해서 toString() 호출 후 equals로 비교해야 한다.
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true
StringBuffer : 공통 메서드 동기화로 인해 멀티스레드 환경에서만 사용
StringBuilder : 단일스레드에서만 안전, Buffer에 비해 속도가 빠름
String... 어려워욥..! 헷갈려욥..!