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


157

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


회문을 생성하는 함수를 작성해야한다고 말하고 있는데, 크기는 사용자 지정이며 최대 1 백만 자까지 가능합니다.
Robert

3
SPOJ 의 문제 에 100 기가 바이트 파일이 포함되어있을 수 있으며 한 번에 문자열로로드 하시겠습니까? 진심으로 ... 스캐너를 사용하십시오!
Grim

답변:


242

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

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

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


43
... 또는 최대 힙 크기를 2로 나눈 값입니다. 문자가 2 바이트
이므로

2
@ ChssPly76 : 그렇습니다. 답변을 편집했습니다. 감사합니다.
빌 도마뱀

2
최대 힙 크기를 어떻게 알 수 있습니까? 또한 판사가 내 문제를 테스트하기 위해 사용하는 Java 가상 머신이 Integer인지 몰라 JVM 의존 사양의 일부입니다 .MAX_VALUE
andandandand

6
Integer.MAX_VALUE는 항상 2147483647 (2 ^ 31-1)이며 이는 Java 사양의 일부입니다.
cd1

4
64 비트 JVM을 가정하면 해당 길이의 문자열을 저장하려면 8GB의 가상 메모리가 필요하기 때문입니다.
Robert Fraser

21

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


내부 구현은 관련이 없습니다. 예를 들어, 문자 데이터를 long 배열로 저장할 수없는 이유는 없습니다. 문제는 인터페이스가 길이에 정수를 사용한다는 것입니다. getBytes매우 큰 문자열을 시도하면 비슷한 문제가 발생할 수 있습니다.
Tom Hawtin-tackline

사실입니다-나는 그 사실을 암시하고있었습니다. 내 잘못이야.
aperkins

15

이론적으로 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 억 자만 얻을 수 있습니다.


2
Java 9의 소형 문자열 은 Latin-1 또는 UTF-16 인코딩을 사용합니다. 가변 길이 인코딩, 즉 3 바이트 문자가 없습니다.
apangin

@apangin "UTF-8과 같은 대체 인코딩을 사용하는 것은 목표가 아닙니다"수정에 감사드립니다.
Peter Lawrey

5

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


1
응용 프로그램이 숫자와 관련하여 수행 할 작업에 따라 다릅니다. 회문을 찾거나 (소수) 숫자를 세는 것과 같은 텍스트 작업을 수행하려는 경우 문자열이 더 좋습니다. 산술 연산을하려면 BigDecimal (또는 BigInteger)이 더 좋습니다.
Stephen C

문제는 "각 K에 대해 K보다 큰 작은 회문을 출력합니다"입니다. (여기서 K는 주어진 숫자입니다). K보다 작은 첫 번째 회문을 출력하는 것은 매우 간단합니다. K보다 큰 것을 찾는 데 산술이 필요합니다. 예 : 999999999999보다 큰 다음 회문을 찾거나 12922보다 큰 다음 회문을 찾으십시오.
Thorbjørn Ravn Andersen

4

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


3

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

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


4
Java-9 제한 문자열 크기를 2GB에서 1GB로 지정할 수 있습니까?
Aditya Gupta

-1

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


2
Java char유형이 정확히 16 비트 인 것을 제외하고 UTF-16이 사용하는 비트 수는 실제로 중요하지 않습니다.
awksp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.