2014-12-06 2 views
4

long int를 사용하여 배열을 인덱싱 할 수 있습니까? 아니면 허용되지 않습니까?int가 긴 배열을 색인 할 수 있습니까?

코드에서 우렁찬 소리입니다.

long x = 20; 
char[] array = new char[x]; 

또는

long x = 5; 
char res; 
res = array[x]; 
+2

그렇게 할 때 오류가 있습니까? –

답변

5

당신이 보는 경우 Java Documentation 10.4 :

배열은 INT 값에 의해 색인되어야한다 short, byte 또는 char 값은 도 단항 숫자 승격 (§5.6.1)을 받아 int 값이되기 때문에 색인 값으로 사용될 수 있습니다.

긴 인덱스 값 을 사용하여 배열 구성 요소에 액세스하려고하면 컴파일 타임 오류가 발생합니다. 이 같은 것을 보일 것이다 얻을 것

오류 : 어떤 이유로 당신이 긴에 저장된 인덱스가있는 경우

test.java:12: possible loss of precision 
found : long 
required: int 
     System.out.println(array[index]); 
           ^
1 error 

, 단지 int로 캐스팅 한 후 색인 배열입니다. 충분히 큰 배열을 만들 수 없으므로 Java의 정수로 인덱싱 할 수 없습니다. 따라서 긴 정수는 필요 없습니다.

+0

이 오류에 대해 알고 있는데, 다른 방법이 있는지 물어 보려고했습니다. 하지만 Java에서 int는 C와 동일한 범위를 가지고 있음을 알게되었습니다. 어쨌든 답장을 보내 주셔서 감사합니다. –

+0

'Java에서 정수로 인덱싱 할 수없는 크기의 배열을 만들 수 없습니다. . 'int [] x = new int [Integer.MAX_VALUE];'런타임 오류 \t 시간 : 0.04 메모리 : 711168 신호 : -1'가됩니다. 그러나 "무제한"숫양이 있다면 어떻게 될까요? 2.147.483.647 배열 길이 x 4 + 4 (인덱스 + 값) = 17179869176 바이트 = 약 16GB의 램. – Tschallacka

4

아니요, 불가능합니다. JLS 15.10 배열 이니셜의식이 int로 승격해야한다고 :

각 차원 식 단항 숫자 프로모션을 겪는다 (§5.6.1). 수준 올리기 유형이 int 여야하며 그렇지 않으면 컴파일 타임 오류가 발생합니다. 와

같은 일이 배열 액세스 식 (JLS 15.13)에 적용

인덱스식이 단항 숫자 승진을 거쳐 (§5.6.1). 수준 올리기 유형이 int 여야하며 그렇지 않으면 컴파일 타임 오류가 발생합니다. 당신이 long를 사용하려면

먼저 int에 캐스팅해야합니다 :

char[] array = new char[(int) x]; 
res = array[(int) x]; 
2

기술적으로는 Unsafe 클래스를 사용하여 이러한 구조를 가질 수있다. 그것으로 당신이 원하는만큼 많은 메모리를 할당 할 수 있습니다. 이것이 네이티브 메모리이며 힙 메모리가 아니라는 점에주의하십시오. 이 때문에 일반적인 배열에 비해 단점이 있습니다 : 메모리가 가비지 수집되지 않습니다 (수동으로 메모리 할당을 해제해야 함) 바운드 검사가 없으므로 조심하지 않으면 seg fault 및 crash가 발생할 수 있습니다 당신의 JVM.

는 큰 배열 섹션에서, 여기에 예를 참조하십시오 http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

은 또한 JVM과 언어의 향후 버전 크기 long의 지원 배열을해야합니다 소문이있다.

관련 문제