2개의 String 객체가 있을때 ,str1 + str2 와 같은 연산을 하게 되면 새로운 String을 생성하는 것을 알 수 있다.
String은 소위 불변(immutable)객체라고 한다.
즉, String 객체는 한번 생성되면 변경할 수 없다. 위와 같이+ 연산자를 사용하여 문자열을 연결하면, 연결할 때 마다 새로운 문자열 객체가 생성된다는 것을 의미한다. 또한 이전에 있던 문자열은 JVM의 GC가 처리하게 된다
따라서, String 객체와 String 객체를 더하는 행위는 메모리 할당과 메모리 해제를 발생시켜서 더하는 연산이 많아진다면 성능적으로 좋지 않다.
StringBuilder
위 같은 문제점을 해결하기 위해서 StringBuilder가 등장하게 되었다. StringBuilder는 String과 다르게 mutable 한 성질을 가지고 있다. ⇒ 값이 변할 수 있는 것이다
StringBuilder는 String과 문자열을 더할 때 새로운 객체를 생성하는 것이 아니라 기존의 데이터에 더하는 방식을 사용하기 때문에 속도도 빠르며 상대적으로 부하가 적다. ⇒ 따라서 긴 문자열을 더하는 상황이 발생할 경우, StringBuffer 또는 StringBuilder를 적극적으로 사용해보자!
StringBuffer와 StringBuilder의 차이는 멀티쓰레드 환경에서 thread-safe 여부가 다르다. StringBuffer는 thread-safe 하므로 여러 쓰레드에서 동시에 해당 문자열에 접근한다면 사용을 고려하고, 그렇지 않다면 StringBuilder를 사용하는 것이 성능이 더 유리하다.(성능과 thread-safe는 반비례라고 생각하면 된다)
정리하면
문자열 변경이 빈번하지 않는다면 String 사용 고려한다
문자열이 빈번하게 변경되면서 멀티쓰레드 환경이라면 StringBuffer 사용을 고려한다
문자열이 빈번하게 변경되면서 멀티쓰레드 환경이 아니라면 StringBuilder 사용을 고려한다.
import 필요없다.
StringBuilder 생성자
//StringBuilder(java.lang.StringBuilder) 객체생성
StringBuilder sb = new StringBuilder(); // 객체선언
StringBuilder sb = new StringBuilder("aaa"); //객체선언하고 바로 문자열 바로 넣을 수 있다.
StringBuilder 주요 메소드
StringBuilder sb = new StringBuilder();
sb.append(str); //str 문자열을 추가한다
sb.insert(int offset, String str); // offset위치에 str을 추가한다
sb.replace(int index1, int index2, String str); //첫번째와 두번째 파라미터로 받은 숫자 인덱스에 위치한 문자열을 대체한다
sb.toString(); // String으로 변환
sb.reverse(); //해당 문자 전체를 뒤집기
예시
import java.lang.StringBuilder;
import java.io.IOException;
public class sb{
public static void main(String[] args) throws IOException{
StringBuilder sb = new StringBuilder("aaa");
//문자열 추가
System.out.println(sb.append("bbb")); //aaabbb
System.out.println(sb.append(4)); //aaabb4
//문자열 삽입
System.out.println(sb.insert(2,"ccc")); //aacccabbb4
//문자열 치환, 문자열 교체
System.out.println(sb.replace(3,6,"ye")); //aacyebbb4
//인덱싱, 문자열 자르기
System.out.println(sb.substring(5)); // bbb4
System.out.println(sb.substring(3, 7)); //yebb
//문자 삭제
System.out.println(sb.deleteCharAt(3)) //aacebbb4
//문자열 삭제
System.out.println(sb.delete(3, sb.length())); //aac
//문자열 변환
System.out.println(sb.toString()); //aac
//문자열 뒤집기
System.out.println(sb.reverse()); //caa
//문자 대체, 문자 교체, 문자 치환
sb.setCharAt(1, 'b');
System.out.println(sb); // cba
//문자열 길이 조정
sb.setLength(2);
System.out.println(sb); //cb
}
}
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String str;
while((str = br.readLine()) != null){
sb.append(str) //반복문으로 str 문자 추가
.append("\n"); //"\n"줄바꿈
}
System.out.print(sb);
}
}