* 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

+ Recent posts