2013-12-13 2 views
0

현재 주어진 정수를 기반으로 문자열을 반환하는 거대한 메서드가 있습니다. 그것은 각각 진술을 사용하며, 각각 casestring constant을 반환합니다. 길이가 약 10 ~ 50 자 정도 인 683 개의 고유 한 문자열이 있으며, 모두 해당 메서드 내에서만 사용됩니다. 이 문자열이 언제로드되는지 알고 싶습니다. 수업 시간에로드됩니까? 그렇다면 내가 처음에이 문자열을로드 할 수있는 방법이 있습니까? 더 이상 참조가 없을 때 garbaged가 발생합니까?java - 메소드 내부의 문자열이 클래스로드 시간에 즉시로드됩니까?

현재로서는 문자열 테이블이 들어있는 파일에서 해당 문자열을로드하고 있습니다. WeakHashMap에 배치해야합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

또 다른 대안은 정적 필드에서 각 문자열을 보유하는 클래스를 만드는 것입니다. 그렇게하면 필드 값을 처음 가져올 때만로드됩니다. 그러나 그것은 나의 꾸러미를 거대하게 할 것이다.

또한 dalvik-vm은 동일한 문자열 상수로드 루틴을 사용합니까?

+2

2 바이트/char * 50 문자/문자열 * 700 문자열 = 70 kB의 데이터. 나는 그것에 대해 걱정하지 않을 것이다. –

+1

정말 switch 문이 아니라 연관 배열을 사용해야합니다. 스위치 문을보고 싶지 않습니다. 그런 다음 연관 배열을 원하는 수준으로 배치하고 원하는 위치에서 원하는 위치로 가져올 수 있습니다. – Leifingson

+0

답변이 있습니다 : http://stackoverflow.com/questions/4918399/what-type-of-memory-heap-or-stack-string-constant-pool-in-java-gets-stored –

답변

1

Sun은 문자열 풀이라는 많은 새로운 Java 프로그래머에게 다소 혼란스러운 최적화를 수행했습니다. 그것은 문자열을 허용합니다. 문자열은 가장 많이 사용되는 객체 중 하나인데, 객체 자체를 최적화하고 공간을 절약합니다. 중요한 점은 String Pool이 String 리터럴에만 적용된다는 것입니다. String 리터럴은 String 생성자를 사용하지 않고 값이 할당되었음을 의미합니다.

문자열 풀링 (문자열 정규화라고도 함)은 여러 String 개체를 같은 값이지만 다른 ID를 단일 공유 String 개체로 바꾸는 프로세스입니다. 자신 만의 Map (요구 사항에 따라 소프트 또는 약한 참조가있을 수 있음)을 유지하고지도 값을 표준화 된 값으로 사용하여이 목표를 달성 할 수 있습니다. 또는 JDK에서 제공하는 String.intern() 메서드를 사용할 수 있습니다.

JVM 문자열 풀의 모든 문자열은 프로그램 루트에서 해당 문자열에 대한 참조가없는 경우 가비지 수집 대상입니다. 인턴 된 문자열이 범위를 벗어나 다른 참조가없는 경우 JVM 문자열 풀에서 가비지 수집됩니다.

그래서 JVM이 이미 내부적으로 수행하므로 신경 쓸 필요가 없습니다.

+0

죄송합니다. 1 월 실수로 눌렀습니다 –

+0

문자열 인턴 http://en.wikipedia.org/wiki/String_interning – Leifingson

+0

자바가 문자열 풀을 사용하고 있습니다. 내가 알지 못하는 것은 그러한 문자열을 해당 풀에 배치 할 때, 즉 클래스 초기화의 의미에서로드 될 때뿐 아니라 필요할 때만로드된다는 것입니다. –