문자열 에 능통 하 다 고 했 더 니 면접 관 이 자바 의 String 에 길이 제한 이 있 느 냐 고 물 었 다.

3504 단어
String 은 자바 에서 매우 중요 한 데이터 형식 입 니 다. 기본 데이터 형식 을 제외 하고 String 은 가장 광범 위 하 게 사용 되 지만 String 에 대해 서 는 무시 하기 쉬 운 것 이 많 습 니 다.
본 논문 에서 우리 가 토론 하고 자 하 는 문제 와 같이 자바 의 String 은 길이 제한 이 있 습 니까?
이 문 제 는 컴 파일 기간 과 운영 기간 으로 두 단계 로 나 누 어 보아 야 한다.시기 에 따라 제한 이 다르다.
01 컴 파일 기간
우선, 우리 가 코드 에서 String s = "를 사용 할 때 합 리 적 으로 추측 해 봅 시다.의 형식 으로 String 대상 을 정의 할 때 '' 문자 의 개 수 는 제한 이 있 습 니까?
합 리 적 인 추론 이 므 로 충분 한 근거 가 필요 합 니 다. 그래서 우 리 는 String 의 소스 코드 에 착안 하여 Public String (char value [], int offset, int count) 의 정의 에 따라 count 는 int 형식 이기 때문에 char value [] 에서 Integer. MAX 를 최대 로 저장 할 수 있 습 니 다.VALUE 개, 즉 2147483647 글자.(jdk1.8.0_73)
그러나 실험 에 의 하면 String s = ";중 최대 65534 글자 가 가능 하 다.이 수 를 넘 으 면컴 파일 기간 에 잘못 보고 할 겁 니 다.
public static void main(String[] args) {

          String s = "a...a";//  65534 a

          System.out.println(s.length());

          String s1 = "a...a";//  65535 a

          System.out.println(s1.length());

}


이상 코드 는 String s1 = "a... a"; /총 65535 개의 a 곳 을 컴 파일 하 는 데 실 패 했 습 니 다:
✗ javac StringLenghDemo.java

StringLenghDemo.java:11:   :        


분명히 길이 제한 이 2147483647 인 데 왜 65535 자 는 컴 파일 할 수 없 습 니까?
문자열 의 글자 수 를 사용 하여 String 을 직접 정의 할 때 문자열 을 상수 탱크 에 저장 합 니 다.그렇다면 위 에서 언급 한 65534 는 사실 상수 탱크 의 제한 이다.
상수 탱크 의 모든 데이터 항목 도 자신의 유형 이 있다.자바 의 UTF - 8 인 코딩 유 니 코드 문자열 은 상수 풀 에서 CONSTANT 로Utf 8 유형 표시.
CONSTANTUtf 8 info 는 CONSTANTUtf 8 형식의 상수 탱크 데이터 항목 으로 상수 문자열 을 저장 합 니 다.상수 탱크 의 모든 글자 의 양은 거의 CONSTANTUtf 8 info 를 통 해 설명 된다.CONSTANTUtf8_info 의 정 의 는 다음 과 같 습 니 다:
CONSTANT_Utf8_info {

     u1 tag;

     u2 length;

     u1 bytes[length];

}


본 논문 의 중점 은 CONSTANTUtf 8 info 의 소개 가 아니 기 때문에 상세 하 게 전개 되 지 않 습 니 다. 우 리 는 글자 의 정 의 된 문자열 을 사용 하여 class 파일 에 CONSTANTUtf 8 info 로 저장 해 야 합 니 다. CONSTANTUtf 8 info 에는 u2 length 가 있 습 니 다.이 유형의 저장 데이터 의 길 이 를 나 타 냈 다.
u2 는 기호 가 없 는 16 비트 정수 이기 때문에 이론 적 으로 허용 되 는 최대 길 이 는 2 ^ 16 = 65536 이다.한편, 자바 클 라 스 파일 은 하나의 변형 UTF - 8 형식 으로 문 자 를 저장 하고 null 값 은 두 개의 바이트 로 표시 하기 때문에 65536 - 2 = 65534 개의 바이트 만 남 았 다.
이 점 에 대해 the class file format spec 에서 도 명확 한 설명 이 있 습 니 다.
The length of field and method names, field and method descriptors, and other constant string values is limited to 65535 characters by the 16-bit unsigned length item of the CONSTANTUtf8info structure (§4.4.7). Note that the limit is on the number of bytes in the encoding and not on the number of encoded characters. UTF-8 encodes some characters using two or three bytes. Thus, strings incorporating multibyte characters are further constrained.


즉, 자바 에 서 는 상수 탱크 에 저장 해 야 할 모든 데 이 터 는 길이 가 65535 를 초과 할 수 없습니다. 이것 은 당연히 문자열 의 정의 도 포함 되 어 있 습 니 다.
02 운행 기간
위 에서 언급 한 이러한 String 길이 의 제한 은 컴 파일 기간 의 제한 입 니 다. 즉, String s = "을 사용 하 는 것 입 니 다.이런 글자 의 액면가 방식 이 정 의 될 때 만 있 는 제한.
그럼String 은 운행 기간 에 제한 이 있 습 니까? 답 은 있 습 니 다. 바로 우리 가 앞에서 언급 한 Integer. MAX 입 니 다.VALUE, 이 값 은 약 4G 이 며, 운행 기간 에 String 길이 가 이 범 위 를 초과 하면 이상 을 던 질 수 있 습 니 다.(jdk 1.9 이전)
int 는 32 비트 변수 유형 으로 정수 부분 을 따 서 계산 하면 그들 이 가장 길 게 가 질 수 있 습 니 다.
2^31-1 =2147483647   16-bit Unicodecharacter

2147483647 * 16 = 34359738352  

34359738352 / 8 = 4294967294 (Byte)

4294967294 / 1024 = 4194303.998046875 (KB)

4194303.998046875 / 1024 = 4095.9999980926513671875 (MB)

4095.9999980926513671875 / 1024 = 3.99999999813735485076904296875 (GB)


괜 찮 으 면 좋아요 누 르 고 가 죠.

좋은 웹페이지 즐겨찾기