항상 문자열 조작할 때면 String과 StringBuilder 생각을 하는 편입니다.
오늘 이 차이에 대해 기억이 안나서 책을 다시 살펴보니!
중요한 차이점이 있었다는걸 한번 더 되새기게 되었습니다.
String 클래스 : 문자열을 조작할 때 해당 리터럴을 바꾸는 것처럼 보이지만 사실 새로운 String객체를 다시 생성합니다. (변경불가)
StringBuilder 클래스 : 내부 버퍼(데이터를 저장하는 메모리)에 문자열을 저장해두고 그 안에서 추가,수정,삭제 작업을 하도록 설계되어 있습니다.
즉! String은 문자열 변경시 이전 객체는 계속버려지고 새로운 문자열 객체를 생성을 함으로 때문에 효율성이 좋다고 볼 수 없습니다.
문자열을 자주 변경해주어야 한다면 StringBuilder를 사용하는게 효율적 입니다.
주의!) -> 문자열을 단순히 비교하거나 읽을 때는 String이 StringBuilder보다 더 효율적이다.
class Solution {
public String solution(String my_string, int[] index_list) {
StringBuilder result = new StringBuilder();
for (int index : index_list) {
// 주어진 인덱스에 해당하는 글자를 StringBuilder에 추가
if (index >= 0 && index < my_string.length()) {
result.append(my_string.charAt(index));
}
}
return result.toString();
}
}

StringBuilder는 단일스레드 환경에서 사용됨으로 , 단일 스레드로 동작하는 로직에서 문자열을 효율적으로 처리할 때 사용된다.
성능측면에서는 string Builder가 더 빠르다.
StringBuffer는 멀티스레드 환경에서 문자열 조작이 필요한 경우 사용된다.
여러 스레드가 동시에 문자열을 처리할때 -> 서버 애플리케이션
buffer에 담아둔 다음 동기화해주면서 계속 변경
StringTokenizer: 문자열을 순차적으로 하나씩 토큰으로 가져오는 방식. 메모리 효율적이며, 토큰을 한 번에 다 쓸 필요가 없을 때 사용.
split(): 문자열을 한 번에 모두 분리해서 배열로 반환. 모든 토큰을 한꺼번에 사용하거나, 정규식을 통한 복잡한 구분이 필요할 때 사용.
즉 전자는 토큰이 다 필요없을때 순차적으로 필요한 만큼만 처리할 때 효과적이고
split는 전체가 필요할 때 효과적이다.