[java] Java String은 몇 개의 문자를 가질 수 있습니까?

Sphere Online Judge (SPOJ) 의 Next Palindrome 문제를 시도하고 있는데 최대 백만 자릿수의 정수에 대한 회문을 찾아야합니다. Strings를 뒤집기 위해 Java 함수를 사용하는 것에 대해 생각했지만 String이 길어질 수 있습니까?



답변

당신은 길이의 문자열을 얻을 수 있어야합니다

  1. Integer.MAX_VALUE항상 2,147,483,647 (2 31-1 )
    (Java 스펙에 의해 정의 됨, String 클래스가 내부 스토리지에 사용하는 배열의 최대 크기)
    또는

  2. Half your maximum heap size(각 문자가 2 바이트 이므로) 더 작은 것입니다 .


답변

내부 배열에 의해 유지되고 배열은 Java에서 정수로 색인화되므로 최대 2 ^ 31-1 자일 수 있다고 생각합니다.


답변

이론적으로 Integer.MAX_VALUE자를 사용할 수 있지만 JVM은 사용할 수있는 배열의 크기가 제한됩니다.

public static void main(String... args) {
    for (int i = 0; i < 4; i++) {
        int len = Integer.MAX_VALUE - i;
        try {
            char[] ch = new char[len];
            System.out.println("len: " + len + " OK");
        } catch (Error e) {
            System.out.println("len: " + len + " " + e);
        }
    }
}

Java 8 업데이트 92 인쇄

len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483645 OK
len: 2147483644 OK

참고 : Java 9에서 Strings는 byte []를 사용하므로 멀티 바이트 문자가 둘 이상의 바이트를 사용하고 최대 값을 더 줄입니다. 예를 들어 이모티콘과 같은 4 바이트 코드 포인트가 모두 있으면 약 5 억 자만 얻을 수 있습니다.


답변

당신은 당신 의 전화 번호 BigDecimal대신에 사용을 고려 했습니까 String?


답변

Integer.MAX_VALUE는 문자열의 최대 크기 + 메모리 크기에 따라 다르지만 구형 온라인 판사의 문제는 해당 기능을 사용할 필요가 없습니다.


답변

Java9는 byte []를 사용하여 String.value를 저장하므로 Java9에서는 약 1GB 문자열 만 얻을 수 있습니다. 반면에 Java8은 2GB 문자열을 가질 수 있습니다.

문자 “I”는 “char”를 의미하므로 일부 문자는 일부 이모티콘과 같이 BMP에서 표현할 수 없으므로 더 많은 (현재 2) 문자가 필요합니다.


답변

친구들이여, 힙 부분이 악화됩니다. UTF-16은 16 비트로 제한되지 않으며 32로 확장 될 수 있습니다