programing

Java에서 문자열의 최대 길이 - 호출 길이() 메서드

newsource 2022. 9. 28. 00:12

Java에서 문자열의 최대 길이 - 호출 길이() 메서드

Java에서 최대 크기 a는 얼마입니까?String는 가지고 있을 수, 이 오브젝트는 있을 수 있습니다.length()★★★★★★★★★★★★★★★★?

는 그것을 있다.length()Stringchar [];

클래스의 메서드를 고려하면int이 메서드에서 반환되는 최대 길이는 입니다.2^31 - 1(20파운드)

「」등).char[]은 아마 되어 있을 것입니다.Strings), 10장: Java Language Specification, Java SE 7 Edition의 Arrays는 다음과 같습니다.

배열에 포함된 변수에는 이름이 없습니다. 대신 음이 아닌 정수 인덱스 값을 사용하는 배열 액세스 식에 의해 참조됩니다.이러한 변수를 배열의 구성 요소라고 합니다.어레이에 다음이 있는 경우n은요, '성분'이라고 해요.n배열의 길이입니다.배열의 컴포넌트는 다음 정수 인덱스를 사용하여 참조됩니다.0로로 합니다.n - 1 , 함함.

또한 인덱싱은 다음과 같아야 합니다.int제10.4절에 언급된 바와 같이 값:

.int표시

따라서, 한계는 실제로 다음과 같습니다.2^31 - 1는 음이 '음'의이기 때문입니다intdiscloss.discloss 。

그러나 어레이의 최대 할당 가능 크기 등 다른 제한이 있을 수 있습니다.

java.io.DataInput.readUTF() ★★★★★★★★★★★★★★★★★」java.io.DataOutput.writeUTF(String)라고 String오브젝트는 2바이트 길이의 정보와 문자열 내의 모든 문자의 변경된 UTF-8나타납니다.여기서 String의 길이는 스트링의 변경된 UTF-8 표현 바이트 수에 의해 제한됩니다.DataInput ★★★★★★★★★★★★★★★★★」DataOutput.

또한 Java 가상 시스템 규격에 있는 의 규격은 다음과 같이 구조를 정의합니다.

CONSTANT_Utf8_info {
    u1 tag;
    u2 length;
    u1 bytes[length];
}

length의 크기는 2바이트임을 알 수 있습니다.

메서드의 " " " " )String.length()는 )개요int 「」라고는 할 수 없습니다.Integer.MAX_VALUE의 경우, 「」, 「」, 「」, 「」,int이치노 언어 .intint전에 (내) 가 선택하기 위한 입니다.int★★★★★★★★★★★★★★★★★★★★★★★★★★★

컴파일 시 최대 길이는 최대 65536입니다. 길이는 변경된 UTF-8 표현 바이트 수이며 의 문자 수가 아님에 주의해 주십시오.String★★★★★★ 。

String오브젝트는 런타임에 훨씬 더 많은 문자를 가질 수 있습니다. 을 사용하는 는, 「」를 사용합니다.String에는 「」가 있습니다.DataInput ★★★★★★★★★★★★★★★★★」DataOutput 긴 하지 않는 이 좋습니다.String Objective-C의 Objective-C에 상당하는 Objective-C를 구현했을 때 이 를 발견했습니다.DataInput.readUTF() ★★★★★★★★★★★★★★★★★」DataOutput.writeUTF(String).

는 정수로 색인화해야 합니다.Integer.MAX_INT(2-131 또는 2 147 483 647)이것은, 물론, 그 사이즈의 어레이를 격납할 수 있는 충분한 메모리가 있는 것을 전제로 하고 있습니다.

저는 8GB RAM을 탑재한 2010년형 iMac을 사용하고 있으며, Eclipse Neon을 실행하고 있습니다.2Java 1.8.0_25를 사용한 릴리스(4.6.2).VM 인수 -Xmx6g을 사용하여 다음 코드를 실행했습니다.

StringBuilder sb = new StringBuilder();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
    try {
        sb.append('a');
    } catch (Throwable e) {
        System.out.println(i);
        break;
    }
}
System.out.println(sb.toString().length());

다음의 출력이 있습니다.

Requested array size exceeds VM limit
1207959550

따라서 최대 어레이 크기는 ~1,207,959,549인 것 같습니다.그리고 Java의 메모리가 부족해도 실제로는 상관없다는 것을 깨달았습니다.즉, 최대 어레이 크기(어디선가 항상 정의되어 있는 것 같음)를 찾고 있을 뿐입니다.그래서:

for (int i = 0; i < 1_000; i++) {
    try {
        char[] array = new char[Integer.MAX_VALUE - i];
        Arrays.fill(array, 'a');
        String string = new String(array);
        System.out.println(string.length());
    } catch (Throwable e) {
        System.out.println(e.getMessage());
        System.out.println("Last: " + (Integer.MAX_VALUE - i));
        System.out.println("Last: " + i);
    }
}

인쇄 대상:

Requested array size exceeds VM limit
Last: 2147483647
Last: 0
Requested array size exceeds VM limit
Last: 2147483646
Last: 1
Java heap space
Last: 2147483645
Last: 2

따라서 최대값은 Integer인 것 같습니다.MAX_VALUE - 2 또는 (2^31) - 3

왜제 P.S.가 아닌지는 잘 .StringBuilder에 상한선인.1207959550 my my whilechar[]( (2^31)-3에서 를 기록했습니다.AbstractStringBuilder로 늘리다char[]아마 그게 문제의 원인일 거예요

0x7FFFF (2147483647)의 int에 바인드 되어 있는 것 같습니다.

String 클래스의 length() 메서드의 반환 유형은 int입니다.

public int length()

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#length() 를 참조해 주세요.

따라서 int의 최대값은 2147483647입니다.

문자열은 내부적으로 char 배열로 간주되므로 인덱싱은 최대 범위 내에서 수행됩니다.이는 2147483648번째 멤버를 인덱싱할 수 없음을 의미합니다.따라서 Java에서 String의 최대 길이는 2147483647입니다.

기본 데이터 유형 int는 Java로 4바이트(32비트)입니다.1비트(MSB)가 시그니처 비트로 사용되기 때문에범위는 -2^31 ~2^31-1(-2147483648 ~2147483647)로 제한됩니다.인덱싱에 음수 값을 사용할 수 없습니다.따라서 사용할 수 있는 범위는 0 ~2147483647입니다

가와사키 다카히코의 답변에서 설명한 바와 같이, java는 수정된 UTF-8 형식의 유니코드 문자열을 나타내며, JVM-Spec CONT_UTF8_info Structure에서는 2바이트가 길이에 할당됩니다(String 문자 수가 아닙니다).
ASM jvm 바이트 코드라이브러리 메서드에 다음 내용이 포함되어 있습니다.

public ByteVector putUTF8(final String stringValue) {
    int charLength = stringValue.length();
    if (charLength > 65535) {   
   // If no. of characters> 65535, than however UTF-8 encoded length, wont fit in 2 bytes.
      throw new IllegalArgumentException("UTF8 string too large");
    }
    for (int i = 0; i < charLength; ++i) {
      char charValue = stringValue.charAt(i);
      if (charValue >= '\u0001' && charValue <= '\u007F') {
        // Unicode code-point encoding in utf-8 fits in 1 byte.
        currentData[currentLength++] = (byte) charValue;
      } else {
        // doesnt fit in 1 byte.
        length = currentLength;
        return encodeUtf8(stringValue, i, 65535);
      }
    }
    ...
}

, 「」, 「1바이트」를 합니다.encodeUTF8★★★★

final ByteVector encodeUtf8(final String stringValue, final int offset, final int maxByteLength /*= 65535 */) {
    int charLength = stringValue.length();
    int byteLength = offset;
    for (int i = offset; i < charLength; ++i) {
      char charValue = stringValue.charAt(i);
      if (charValue >= 0x0001 && charValue <= 0x007F) {
        byteLength++;
      } else if (charValue <= 0x07FF) {
        byteLength += 2;
      } else {
        byteLength += 3;
      }
    }
   ...
}

길이이며 "65535"가 아닙니다.char를 세다
위의 utf8 구조 링크에서 JVM의 수정된 유니코드 코드 포인트 범위를 찾을 수 있습니다.

언급URL : https://stackoverflow.com/questions/816142/strings-maximum-length-in-java-calling-length-method