String
- String class 는 character string을 의미한다.
- Serializable, Comparable, CharSequence 인터페이스 상속
- public final class로 되어 있다 → final형이기 때문에 초기값으로 주어진 String은 불변이고, 새로 할당되면 덮어씌워지는 것이 아닌 새로운 클래스에 생기는 것이다.
- String 변수에 새로운 값을 할당할 때마다 해시코드가 새로 생성된다.
- String이 여러번 새로 할당될 경우 → 각 String의 주소값이 stack에 쌓이고, 클래스들은 GarbageCollector가 호출되기 전까지 지속적으로 heap에 쌓이게 된다. 메모리 관리면에서 별로 좋지 않다.
StringBuffer
- 반면 StringBuffer는 append하는 방식으로 새로운 값을 할당하기 때문에 클래스를 다시 생성하지 않는다
- 클래스가 생성될 때는 메소드와 변수들도 같이 생성되는데, StringBuffer는 이런 시간이 걸리지 않는다.
- 변경 가능한 문자열이지만 synchroniztion이 적용되지 않았음 → multi-thread환경에서 안전한 클래스. multi-thread환경에서는 다른 값을 변경하지 못하도록 하여 web이나 소켓 환경같이 비동기로 동작하는 경우가 많을 때는 StringBuffer가 안전하다
- 반면 StringBuilder는 thread들이 동시에 StringBuilder클래스에 접근할 수 있음