String 클래스와 달리, 인스턴스를 생성할 때 지정된 문자열 변경을 가능하게 해주는 클래스이다.
내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며, StringBuffer 생성시 그 크기를 지정 할 수 있다.(디폴트 사이즈는)
1 | StringBuffer sb = new StringBuffer(); | cs |
1 2 | StringBuffer sb = new StringBuffer("abc"); System.out.println( sb.append("def").append.("ghi") ); //abcdefghi | cs |
1 2 | StringBuffer sb1 = new StringBuffer("abc"); String s1 = sb.toString(); | cs |
1 2 3 4 5 | StringBuffer sb1 = new StringBuffer("abc"); StringBuffer sb2 = new StringBuffer("abc"); System.out.println(sb1 == sb2); //false System.out.println(sb1.equals(sb2)); //false | cs |
String클래스에서는 equals메소드를 오버라이딩해서 문자열의 내용을 비교하도록 구현되어 있지만, StringBuffer클래스는 equals 메소드를 오버라이딩 하지 않기 때문에,
StringBuffer클래스의 equals 메소드를 사용해도 ==(등가비교연산자)로 비교한 것과 같은 결과이다.
👉 toString()메소드로 변환 후 비교해주자.
1 2 3 4 | String s1 = sb1.toSting(); String s2 = sb1.toSting(); System.out.println(sb1.equals(sb2)); //true | cs |
1 2 | StringBuffer sb = new StringBuffer("abc"); char c = sb.charAt(2); // c = 'c' | cs |
1 2 3 4 5 | StringBuffer sb = new StringBuffer("0123456"); sb.deleteCharAt(2); // sb = "023456" StringBuffer sb1 = new StringBuffer("0123456"); sb1.delete(3, 6); // sb1 = "0126" | cs |
1 2 | StringBuffer sb = new StringBuffer("0123456"); sb.setCharAt(5, 'P'); // sb = "01234P6" | cs |
1 2 | StringBuffer sb = new StringBuffer("0123456"); sb.insert(4,"."); //sb = "0123.456" | cs |
1 2 | StringBuffer sb = new StringBuffer("0123456"); sb.reverse(); //sb = "6543210" | cs |
👉 StringBuilder는 멀티 쓰레드에 안전(thread safe)하도록 동기화 되어있다.
동기화가 StringBuffer의 성능을 떨어뜨린다.
멀티쓰레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어뜨리게 된다.
그래서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 탄생하였다.
1 | StringBuilder sb = new StringBuilder( ); | cs |