Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- function test
- 2차원배열 구간합
- MariaDB Query Log
- this
- 구간합구하기
- ajax
- 백준
- 백준 1235번
- 상속과 참조
- 합배열
- Bean LifecCycle
- this와 this() 차이
- 구간합
- 백준 11660번
- @NoArgsConstructor
- 생성자
- jquery
- 백준 11659번
- @AllArgsConstructor
- 마리아DB 쿼리 로그
- map()
- Java
- json
- 자바 람다식
- 슈더코드
- pseudo-code
- SQL
- select
- interrupted()
- InterruptException
Archives
- Today
- Total
평범한 연구소
[JAVA] StringBuilder, StringBuffer 본문
StringBuilder, StringBuffer
- 가변적인 문자열 처리할 경우 String 클래스 보다 처리 속도가 빠름.
- 다양한 함수 이용하여 처리한 후 마지막에 String으로 변환하여 사용함.
- String과 유사한 함수들이 많다.
- 가변적 문자열이 아닌 경우, String 클래스 사용.
- 가변적인 문자열 처리는 아래처럼 "+=" 코딩한다면 성능이 매우 저하됨. 문자열은 불변이므로 += 할때마다 주소가 계속 바뀌는 형식.
- StringBuffer의 append() 사용해야함.
String s = "자바";
s += ",스프링";
s += ",오라클";
- 아래 코드는 내부적으로 StringBuilder로 처리하므로 성능이 우수함. (문자열 결합)
s = "자바" + ",스프링" + ",오라클";
System.out.println(s);
StringBuilder sb = new StringBuilder();
sb.append("자바");
sb.append(",스프링");
sb.append(",오라클");
StringBuilder
- 동시성을 지원하지 않지만, StringBuffer 보다 빠름
StringBuffer
- 동시성 지원
StringBuilder와 StringBuffer의 문자열 값 비교
toString()
- StringBuilder와 StringBuffer의 equals()는 주소 비교. String으로 변환 후 비교해야함.
StringBuilder sb1 = new StringBuilder("korea");
StringBuilder sb2 = new StringBuilder("korea");
System.out.println(sb1==sb2); // false. 주소 비교
System.out.println(sb1.equals(sb2)); // false. 주소비교
// StringBuilder와 StringBuffer의 equals()는 주소 비교
// StringBuilder와 StringBuffer 문자열 비교는 String으로 변환 후 비교
// 문자열로 변환
String s1 = sb1.toString();
String s2 = sb2.toString();
System.out.println(s1.equals(s2)); // true. 문자열(값) 비교
capacity()
- 버퍼의 크기
StringBuilder sb3 = new StringBuilder();
System.out.println("기본 버퍼 크기: "+sb3.capacity()); // 16
append()
- 문자열 뒤에 추가
- String의 += 과 다르게 성능이 저하되지 않음. StringBuilder,StringBuffer 사용 이유.
StringBuilder sb3 = new StringBuilder();
sb3.append("java");
sb3.append("html");
sb3.append("oracle");
sb3.append("spring");
sb3.append("javascript");
System.out.println(sb3);
System.out.println("버퍼 크기: "+sb3.capacity()); // 34 문자열 추가하는 만큼 늘어남.
insert()
- insert(0, "e"): 추가할 위치, 문자열
- 가장 앞에 문자열 추가
특정 부분 뒤에 문자열을 추가하고 싶다면?
- insert(sb3.indexOf("특정부분")+"특정부분".length, "추가할문자열")
- 특정부분의 인덱스를 찾으면 그 인덱스는 시작하는 부분이므로 특정부분의 문자열 길이만큼 더하면 특정부분의 마지막 인덱스가 나옴.
delete()
- 특정 부분의 문자열 삭제
- delete(s, e): s인덱스 ~ e-1인덱스까지 삭제
// 가장 앞에 "프로그래밍" 추가
sb3.insert(0, "프로그래밍"); // (추가할 위치, 문자열)
System.out.println(sb3); // 프로그래밍javahtmloraclespringjavascript
// html 뒤에 css 추가
sb3.insert(sb3.indexOf("html")+"html".length(), "css");
// indexOf()만 하면 html 앞에 추가되므로 html길이만큼 뒤에 추가
System.out.println(sb3); // 프로그래밍javahtmlcssoraclespringjavascript
// spring 삭제
// delete(s,e) => s인덱스에서 e-1인덱스까지 삭제
sb3.delete(sb3.indexOf("spring"), sb3.indexOf("spring")+"spring".length());
System.out.println(sb3); // 프로그래밍javahtmlcssoraclejavascript
// java 부터 끝까지 삭제
sb3.delete(sb3.indexOf("java"), sb3.length()); // 프로그래밍
System.out.println(sb3);
// 모든 문자열 지우기
sb3.delete(0, sb3.length());
System.out.println("문자열 길이: "+sb3.length()); // 0
StringBuilder sb = new StringBuilder();
sb.append("123456789");
sb.delete(0, 3).replace(1, 3, "24").delete(4, 6);
//delete:인덱스0부터 2까지, replace:인덱스1부터2까지, delete:인덱스4부터5까지
//delete:456789 replace:424789 delete:4247
System.out.println(sb);
sb.delete(0, sb.length());
sb.append("123456789");
String s = sb.substring(3, 6);
System.out.println(s); // 456
trimToSize()
- 버퍼의 크기를 문자열 크기로 변경
System.out.println("문자열 길이: "+sb3.length()); // 5
System.out.println("버퍼의 크기: "+sb3.capacity()); // 70
// 버퍼 크기를 문자열 크기로
sb3.trimToSize();
System.out.println("버퍼의 크기: "+sb3.capacity()); // 5
StringBuilder -> StringBuffer로 변환
CharSequence()
- 순차적으로 문자를 읽어낼 수 있는 메소드 등 제공하는 인터페이스
- StringBuilder와 StringBuffer를 변환할 때, toString()로 문자열 변환 거치지 않고 StringBuilder → StringBuffer로 변환 가능
StringBuilder sb = new StringBuilder();
sb.append("seoul");
// StringBuilder와 StringBuffer는 CharSequence 구현클래스이므로
// toString()을 이용하여 문자열로 변환하지 않고
// CharSequence를 이용하여 StringBuilder->StringBuffer로 변환 가능.
CharSequence cs = sb;
StringBuffer sb2 = new StringBuffer(cs);
System.out.println(sb2);
String의 +=, StringBuffer의 append() 성능 차이 확인
package ch07.unit4;
public class Ex12 {
public static void main(String[] args) {
StringTimeEx obj = new StringTimeEx();
obj.stringTime();
obj.stringBuilder();
}
}
class StringTimeEx {
public void stringTime() {
System.out.println("String ...");
long start = System.currentTimeMillis();
String s = "a";
for(int i=0; i<100000; i++) {
s+="a"; // 이렇게 코딩하면 안됨!
}
long end = System.currentTimeMillis();
System.out.println("길이:"+s.length()+", 시간:"+(end-start)+"ms");
}
public void stringBuilder() {
System.out.println("StringBuilder ...");
long start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder("a");
for(int i=0; i<100000; i++) {
sb.append("a");
}
long end = System.currentTimeMillis();
System.out.println("길이:"+sb.length()+", 시간:"+(end-start)+"ms");
}
}
'JAVA > 기본 개념' 카테고리의 다른 글
[JAVA] 추상화 abstract (0) | 2022.07.27 |
---|---|
[JAVA] 상속 | 오버라이딩 | 캐스팅 (0) | 2022.07.25 |
[JAVA] 기본 API | String 클래스 관련 함수 (0) | 2022.07.23 |
[JAVA] 정규식 (0) | 2022.07.21 |
[JAVA] 재귀 호출, 오버로딩 (0) | 2022.07.20 |