2013-02-22 2 views
9

Java 문자열은 변경 불가능하며 동일한 값을 가진 여러 문자열을 인스턴스화하면 동일한 객체 포인터가 반환됩니다. ("풀링"이 맞는지는 모르겠지만 이미 인스턴스화를 줄여서 시간을 절약하기 위해 캐싱을하는 것을 이미 말합니다.)자바가 불변 객체를 최적화합니까?

Java는 다른 사용자 정의) 클래스는 불변입니까? 자바가 클래스가 불변인지 아니면 심지어 이것이 문자열 클래스에 고유 한 것인가를 탐지 할 수 있습니까?

+0

+1 흥미로운 질문입니다. 나는 자바가 최종 멤버들만 가지고있는 클래스를 인식하고 그것들을 불변으로 취급 할 수 있다고 믿는다. 그러나 그에 대한 정확한 정보는 없다. 나는이 질문에 주목할 것이다. 고마워요 – gd1

+2

어쨌든 불변의 객체를 반사음으로 바꾼다면 어떤 일이 일어날 지 고려하지 않습니다. – harold

+0

나는 그것에 대해 조금 놀랐습니다. 감사합니다 – gd1

답변

7

Wrt. 문자열, 찾고있는 단어는 interning입니다.

자바는 자신의 불변 개체에 대해 이렇게하지 않습니다. 그것은 박스형 프리미티브의 캐시 된 버전을 가지고 있습니다. 자세한 내용은 wrapper class caching에서이 기사를 참조하십시오.

0

String Interning은 String 클래스에만 고유합니다. 나는 JVM이 사용자 정의 클래스에 대해 이러한 규칙을 적용하지 않는다고 가정한다.

1

당신이 찾고있는 용어는 itering입니다. Java는 컴파일하는 동안 "자동으로"문자열을 최적화하고 런타임에 개발자가 수행 할 수있는 가능성을 제공합니다. (JVM 버전에 의존 할 때 최적화되는 것에 대한 세부 사항)

지금까지는 변경 불가능한 객체에 대해 설명합니다. 필자는 Java가 동일한 인스턴스를 해결할 수있는 메커니즘을 지원하지 않는다고 생각합니다. 문자열 유형은이 규칙의 예외가 아닙니다.

왜 인스턴스를 생성하려면 연산자 new을 사용해야합니다. new을 사용하여 문자열 인스턴스를 만들면 항상 두 개의 서로 다른 개체가 생성됩니다.

intering은 String 유형에서만 사용할 수 있습니다. 그러나 개념은 무료입니다. 당신은 당신의 변경 불가능한 클래스에 그러한 메소드를 추가 할 수 있고 같은 것을 할 compled 메소드를 작성할 수 있습니다.

2

여기 다른 사람들은이 프로세스를 Strings가 interning이라고 말했기 때문에.

그 같은 리터럴 값이 같은 객체 인에 문자열의 행동이 7 년 이후부터 자바 7에 사실 그렇지 않은 경우가있는 것을 언급 할 가치 : JDK 7에서 인턴

문자열이 더 이상 없다 Java 힙의 영구 생성에서 할당되지만 대신 응용 프로그램이 작성한 다른 오브젝트와 함께 Java 힙의 주요 부분 (젊은 세대와 구세대로 알려짐)에 할당됩니다. 이 변경으로 인해 메인 Java 힙에 더 많은 데이터가 저장되고 영구 생성에서는 데이터가 줄어들어 힙 크기를 조정해야 할 수 있습니다. 대부분의 응용 프로그램에서는이 변경으로 인해 힙 사용이 상대적으로 작은 차이 만 표시되지만 많은 클래스를로드하거나 String.intern() 메서드를 많이 사용하는 응용 프로그램이 더 큰 차이를 보입니다.

자세한 내용은 Java SE 7 RFE을 참조하십시오.

당신의 자신의 불변의 객체에 관해서는 자바가 그들에게 특별한 어떤 일도하지 않습니다. 그것들은 불변이라는 것을 알지 않습니다. 그것은 인라인 방법은 그렇지 않으면 가치가/가능,하지만 멀리 컴파일러와 JVM을 우려로 그들은 단지 또 다른 개체를 감지 할 수있는 경우보다 조금 더 있습니다.

+2

와우, downvoted? 내가 downvote 걸릴 수 있지만 좋은 이유를 알고 있었을 –

관련 문제