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")
→ 가