private final char[] value;private final byte[] value;public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc {
@Stable
private final byte[] value;
...
char는 2byte를 차지하지만, 영어나 숫자는 보통 1byte로 표현이 가능하다.
즉, char[]에서 byte[]로 바뀌면서 메모리를 더 효율적으로 사용하고 있다.
String 클래스를 비교할 때는 == 비교가 아니라, 항상 equals()로 비교해야 한다.
== 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인equals() 메서드를 사용해서 두 객체가 논리적으로 같은지 확인String str1 = new String("hello java");
String str2 = new String("hello java");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2); // true
new String()을 사용해서 인스턴스를 각각 생성해주면, 동일성 비교를 했을 때 false의 결과가 나온다.
하지만, 문자열 리터럴을 사용하는 경우는 다르다. 문자열 리터럴을 사용할 때, 자바는 메모리 효율성과 성능 최적화를 위해 "문자열 풀(String pool)"을 사용한다.

String str3 = "hello java";
String str4 = "hello java";
System.out.println(str3 == str4); // true
System.out.println(str3.equals(str4); // true
String은 불변 객체기 때문에 변경이 필요하다면, 새로운 결과를 만들어서 반환해야 한다.
String str1 = "hello";
str1.concat(" world");
System.out.println(str1); // hello
str2 = str1.concat(" world");
System.out.println(str2); // hello world
String 클래스는 다양한 메서드를 제공한다.
isEmpty(): 길이가 0인지 확인length(): 문자열 길이 반환isBlank(): 길이가 0이거나 공백인지 확인charAt(int index): 특정 인덱스의 문자 반환equals(Object anObject): 특정 object와 동등여부 반환equalsIgnoreCase(String anotherString): 두 문자열을 대소문자 구분없이 비교compareTo(String anotherString): 두 문자열을 사전 순으로 차이 비교"b".compareTo("a") → 1"Hello, Java".compareTo("Hello, World") → -13compareIgnoreCase(String str): 두 문자열을 대소문자 구분없이 사전 순으로 비교startsWith(String prefix): 문자열이 특정 접두사로 시작하는지 확인endsWith(String suffix): 문자열이 특정 접미사로 끝나는지 확인contains(CharSequence s): 문자열이 특정 문자열을 포함하고 있는지 확인indexOf(String ch), indexOf(String ch, int fromIndex): 문자열이 처음 등장하는 위치 반환lastIndexOf(String ch): 문자열이 마지막으로 등장하는 위치 반환substring(int beginIndex, int endIndex): 문자열의 부분 문자열 반환"Hello, Java".substring(4) → o"Hello, Java".substring(7,11) → Javaconcat(String str): 문자열 합치기replace(CharSequence target, CharSequence replacement): 특정 문자열을 새 문자열로 대체replaceAll(String regex, String replacement): 문자열에서 정규 표현식과 일치하는 부분을 새 문자열로 대체replaceFirst(String regex, String replacement): 문자열에서 정규 표현식과 일치하는 첫 번째 문자열을 새 문자열로 대체toLowerCase(): 문자열을 소문자로 변환toUpperCase(): 문자열을 대문자로 변환trim(): 문자열 양 끝의 whitespace 제거strip(): whitespace, 유니코드 공백 제거split(String regex): 문자열을 정규 표현식 기준으로 분할join(CharSequence delimiter, CharSequence... elements): 주어진 구분자로 여러 문자열을 결합valueOf(Object obj): 기본형 값, 다양한 타입을 문자열로 변환String.valueOf(100) → 100String.valueOf(true) → trueString.valueOf(new Object()) → java.lang.Object@a09ee92toCharArray(): 문자열을 문자 배열로 변환format(String format, Object ... args): 형식 문자열과 인자를 사용해서 새로운 문자열 생성String.format("num: %d, bool: %b, str: %s", 10, true, "java")System.out.printf("number: %.3f\n", 10.1234)matches(String regex): 문자열이 정규 표현식과 일치하는지 확인hashCode(): 해시코드 반환getBytes(String charsetName): 문자 인코딩 변환byte[] strToUtf = "가".getBytes("UTF-8") → [EA:B0:80]String UtfToStr = new String(strToUtf, "UTF-8") → 가