String 클래스 구조
public final class String {
//문자열 보관
private final char[] value;// 자바 9 이전
private final byte[] value;// 자바 9 이후
//여러 메서드
public String concat(String str) {...}
public int length() {...}
...
}
자바 9부터 String
클래스에서 char[]
대신에 byte[]
을 사용한다
char
는 2byte를 차지한다. 그런데 영어, 숫자는 보통 1byte 로 표현이 가능하다. 그래서 단순 영어, 숫자로만 표현된 경우 1byte를 사용하고(정확히는 Latin-1 인코딩의 경우 1byte 사용) , 그렇지 않은 나머지의 경우 2byte 인 UTF-16 인코딩을 사용한다. 따라서 메모리를 더 효율적으로 사용할 수 있게 변경되었다String
클래스 비교할 때는 ==
비교가 아니라 항상 equals()
비교를 해야한다
==
연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인equals()
메서드를 사용하여 두 객체가 논리적으로 같은지 확인String
클래스는 내부 문자열 값을 비교하도록 equals()
메서드를 재정의 해두었다String str3 = "hello"
와 같이 문자열 리터럴을 사용하는 경우 자바는 메모리 효율성과 성능 최적화를 위해 문자열 풀을 사용한다String
인스턴스를 미리 만들어둔다. 이때 같은 문자열이 있으면 만들지 않는다String str3 = "hello"
와 같이 문자열 리터럴을 사용하면 문자열 풀에서 "hello"
라는 문자를 가진 String
인스턴스를 찾는다. 그리고 찾은 인스턴스의 참조(x003
)를 반환한다String str4 = "hello"
의 경우 "hello"
문자열 리터럴을 사용하므로 문자열 풀에서 str3
과 같은 x003
참조를 사용한다