문자열이 관리 방법의 실제 구현은 보장 것을 제외하고, 자바 결과적 있어야되지 않습니다
- 문자열 X = "안녕하세요"; 문자열 y = "안녕"; // 보장 그 x == y
- 문자열 x = "안녕"; String y = new String ("hi"); // 가능성은 있지만 == 보장 할 필요는 없습니다! =
- String x = new String ("hi"); String y = new String ("hi"); // 보장! = 그러나 x.equals (y)
- 문자열 x = "안녕"; String y = new String ("hi"). intern(); // 보증 X == y를
사람들은 문자열에 대한 규칙 ....
과거
(이것은 Java8로 변경됩니다), String.intern()
와 문자열 상수 (String x = "hi"
)가에 할당 된입니다 PermGen 메모리 모델의 공간.
결과적으로 GC 메커니즘이 다르기 때문에 무료 힙 공간이 많이 있더라도 String.intern()
을 사용하면 메모리가 부족할 수 있습니다 (PermGen은 일반적으로 128MB 미만).
new String(....)
으로 할당 된 문자열은 일반 힙에 있으며 표준 GC 메커니즘이 있습니다.
우리가 new String ("...")
을 사용하여 Strings의 새로운 인스턴스를 만드는 이유에 관해서는, 내가 그런 식으로 만하는 것이 바람직한 한 곳을 생각할 수 있습니다. 누군가가 결과 객체를 동기화로 사용하려는 경우입니다. 자물쇠. 디버깅 할 때 의미가있을 수 있지만 .....별로 의미가 없습니다. 실수로 다른 String 객체를 동기화 용으로 사용하지 않도록 'new'를 사용해야합니다.
일반적으로 Java 코딩 연습에서는 일반적으로 new String ("....")
을 사용하는 사람을 보지 못했습니다. 실제로 사람들은 대부분 문자열 연결 연산자 등을 사용합니다. 그러나 잘못된 것은 아닙니다. new String(...)
String에 대한 소스 코드를 살펴보면 이 코드는 String을 변경 불가능하게 만드는 것에 크게 의존합니다. 예를 들어, 새로운 String (new String ("hi")); char의 배열 하나만 만들고 String 인스턴스에서 공유됩니다. (그리고 어쨌든 내부 인스턴스가 GC 될 것입니다).