* String
> char[] value; 를 가지고 있다
> 한 번 생성되면 읽기만 가능
> 문자열 + 문자열 연산의 경우, 기존 instance 가 버려지고 새로운 instance 가 생성된다
-> 아래, 'String 성능 향상' 참고
* String 생성의 2가지 방법
1. Literal
> 리터럴로 생성하는 경우, 하나의 instance 를 참조한다
String str1 = "abc";
String str2 = "abc";
boolean result1 = (str1 == str2); //true (주소)
boolean result2 =(str1.equals(str2)); //true (내용)
2. Constructor
> 생성자를 이용해 문자열이 생성되는 경우에는 new 연산자에 의해 메모리 할당이 이루어져 항상 새로운 인스턴스가 생성된다
String str3 = new String("abc");
String str4 = new String("abc");
boolean result3 = (str3 == str4); //false (주소)
boolean result4 = (str3.equals(str4)); //true (내용)
> 모든 *.class 파일에는 'Constant Pool' 이라는 constant list 가 있어서 class 내에서 사용되는 모든 리터럴과 상수들이 저장되어 있다
: intern()
String str5 = "abc";
String str6 = new String("abc");
str6 = str6.intern();
boolean result5 = (str5 == str6); //true (주소)
boolean result6 = (str5.equals(str6)); //true (내용)
- 해당 문자열을 constant pool 에 등록한다. 이미 등록되어 있으면 기존 주소값을 반환한다
- 위 메소드를 수행후에는 equals() 대산 '==' 연산을 이용하면 더 빠르다
* Empty String
String emptyString1 = "";
String emptyString2 = new String(new char[0]);
* String.hashCode()
> 문자열 내용을 이용하여 hashcode 를 생성하므로, 동일 문자열에 대해서는 같은 값이 생성된다 (다른 클래스들은 주소 값 이용)
* String 성능 향상
> String append 시, StringBuffer 나 StringBuilder 를 사용
: "AAA" + "BBB"
- "AAA" 문자열에 대한 메모리 할당 후에, "AAABBB" 문자열을 위해 새로운 메모리를 할당한다
0x100 = "AAA"
0x200 = "AAABBB"
- 또한, '+' 연산을 수행할 때 마다 새로운 StringBuilder 를 생성한다
: ("AAA").append("BBB")
- "AAA" 문자열에 대한 메모리 할당 후에 "BBB" 를 추가한다
0x100 = "AAA"
0x100 = "AAABBB"
- StringBuffer 는 Thread Safty 하지만, StringBuilder 는 그렇지 않다는 것이 차이점이다
'SW > ::: Java' 카테고리의 다른 글
Thread (쓰레드) (0) | 2020.10.09 |
---|---|
Collections (List, Set, Queue, Map) (0) | 2020.10.05 |
Late Binding (0) | 2020.10.04 |
////200927 JDK 15 // early16 (0) | 2020.09.27 |
@FunctionalInterface (0) | 2020.09.15 |