thread-safe
String str = "Hello" // (1)문자열 리터럴
str += "world!" // (2)
String str1 = new String("Hello"); // (1)new
str1 += " world"; // (2)
(2)번 연산 수행하면서 새롭게 (2)Hello World! 를 위한 메모리를 할당하고, (1)로 초기화한 str 객체는 GC의 대상이 된다. → 반복되면 성능에 안좋음..
String str1 = "Hello";
String str2 = "Hello";
==
연산자로 정확한 비교 가능(메모리 주소 비교)new
방식이든 상관없이, 문자열 비교는 항상 equals()
로 하는 것이 좋다.)System.out.println(str1 == str2); // true
new
키워드 사용 : Heap 영역String str3 = new String("Hello");
String str4 = new String("Hello");
new
키워드로 생성할 때마다 heap 에 새로운 String 객체 생성==
연산자가 아니라 equals()
메소드로 객체의 내용을 비교해야 한다.
StringBuilder sb = new StringBuilder();
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuffer sb = new StringBuffer();
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
String
StringBuffer
StringBuilder
*유니코드 : 각 문자를 고유한 숫자로 매핑한 것
✅ UTF-8
✅ UTF-16
✅ UTF-32
YES! 대소문자 구분 여부는 데이터베이스의 정렬 규칙(Collation)
과 밀접한 연관이 있므므로 중요하다!
CHAR, VARCHAR, TEXT 과 같은 문자열 Datatype 에는 Character set
과 Collation
이라는 속성이 있다.
utf8_general_ci
: 대소문자 구분을 하지 않는 Collationutf8_bin
: 대소문자 구분을 하는 Collation
원래는 전 세계 모든 언어가 21bit 에 저장되기 때문에, mysql 에서 utf8 을 3바이트 가변 자료형으로 설계했다.
→ 널리 사용되던 MYSQL / MariaDB 의 구축 환경은 charset-utf8 , collation-utf8_general_ci 였다.
⏩ 하지만….. Emoji 문자열은 모두 4 Byte !!
(+) 기존 utf8 시스템을 utf8mb4 로 바꿔도 값의 손실은 없다.