String은 자바에서 문자열을 나타내는 자료형이다.
// 방법 1 : 리터럴 표기
String str = "Hello World";
// 방법 2
String str2 = new String("Hello World2");
문자열은 위과 같이 두가지 방식으로 표현할 수 있는데 가급적이면 방법 1을 사용하는게 좋다. 그 이유는 방법 1이 가독성이 좋고 컴파일 할 때 최적화에 도움이 되기 때문이다.
String str1 = "Hello world";
System.out.println(str1.indexOf("world")) // 6
String str1 = "Hello world";
System.out.println(str1.contains("world")) // true
String str1 = "Hello world";
str1.replaceAll("Hello", "Bye");
System.out.println(str1) // Bye world
String str1 = "Hello world";
System.out.println(str1.substring(0,5)) // Hello
String str1 = "Hello WORld";
System.out.println(str1.toUppercase()); //HELLO WORLD
System.out.println(str1.toLowercase()); //hello world
String str1 = "a&b&c%d*h";
String[] result = str1.spilt("&"); //{"a", "b&c%d*h"}
String[] result2 = str1.splint("[&%*]") //{"a", "b", "c", "d", "h"}
// regex에서[]은 or이다.
String str1 = "hello world";
System.out.println(str1.startsWith("he")); // true
System.out.println(str1.startsWith("Be")); // false
System.out.println(str1.endsWith("rld")); // true
System.out.println(str1.startsWith("ddd")); // false
String은 불변이므로 자주 추가나 삭제를 할 때는 사용하기 적합하지 않다. 따라서 문자열에 빈번한 수정이 일어날때는 가변적인 StringBuffer나 StringBuilder를 사용하는게 좋다.
String 객체는 한번 생성되면 할당된 공간이 변하지 않는 불변(immutable)이지만 StringBuffer나 StringBuilder는 객체의 공간이 부족할때 버퍼의 크기를 늘려주는 가변(mutable)이다.
String은 크기가 고정되어 있기 때문에 내부 문자열을 수정할 수 없다. 따라서 문자열을 수정할 때마다 새로운 문자열을 리턴한다. 이렇게 사용하지 않는 객체의 수가 늘어나면 프로그램 성능이 느려진다. 따라서 문자열의 수정이 빈번하게 일어나는 작업을 할 때에는 String 보다 StringBuffer나 StringBuilder를 사용하는게 좋다.
이 두 클래스는 내부 Buffer에 문자열을 저장해두고 그 안에서 추가/수정/삭제 작업을 하므로 새로운 객체를 만들지 않고도 문자열을수정할 수 있다.
StringBuffer와 StringBuilder는 사용법이 같으므로 예시는 Buffer만 작성했다.
String s = "hello";
StringBuffer sb = new StringBuffer(s); // String->StringBuffer;
sb.toString(); // StringBuffer -> String
sb.append("world"); // 뒤에 문자열 추가 helloworld
sb.insert(2, "no"); // 인덱스부터 새로운 문자열 추가 henollo
sb.delete(2, 4); // 인덱스 시작부터 끝-1까지 문자 삭제 hello
sb.length(); // 문자열의 길이
sb.capacity(); // 용량의 크기
sb.reverse(); // 문자열 뒤집기
두 클래스는 가변적인 특성을 갖고 있고 제공하는 메서드, 사용방법도 같다. 하지만 두 클래스는 동기화에서 차이를 보인다.
StringBuffer: 각 메소드별로 동기화 키워드가 존재해 멀티스레드 상의 동기화를 지원한다.
StringBuilder: 단일 스레드 환경에서만 사용하도록 설계되어 있으므로 동기화를 지원하지 않는다.
StringBuilder가 속도는 더 빠르지만 작성한 프로그램이 언제 멀티스레드 환경에서 돌아갈지 모르니 StringBuffer로 작성하는게 더 안전하다.