Сколько символов может иметь строка Java?

Я пытаюсь решить проблему следующего палиндрома из Sphere Online Judge (SPOJ), где мне нужно найти палиндром с целым числом до миллиона цифр. Я думал об использовании функций Java для реверсирования строк, но позволят ли они использовать строку так долго?

8 ответов

Решение

Вы должны иметь возможность получить строку длины Integer.MAX_VALUE (всегда 2147483647 (231 - 1) по спецификации Java, максимальный размер массива, который класс String использует для внутреннего хранения) или половину вашего максимального размера кучи (так как каждый символ составляет два байта), в зависимости от того, что меньше.

Я считаю, что они могут содержать до 2^31-1 символов, так как они хранятся во внутреннем массиве, а массивы индексируются целыми числами в Java.

Хотя теоретически вы можете использовать символы 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);
        }
    }
}

на Oracle 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[], что будет означать, что многобайтовые символы будут использовать более одного байта и дополнительно уменьшать максимум. Если у вас есть все четырехбайтовые кодовые точки, например, эмодзи, вы получите только около 500 миллионов символов.

Рассматривали ли вы использование BigDecimal вместо String держать ваши номера?

Integer.MAX_VALUE - это максимальный размер строки +, зависит от объема вашей памяти, но проблема в сфере онлайн судит, вам не нужно использовать эти функции

Java9 использует byte[] для хранения String.value, поэтому вы можете получить только около 1 Гб строк в Java9. Java8, с другой стороны, может иметь строки 2 ГБ.

Под символом я подразумеваю "символы", некоторые символы не могут быть представлены в BMP(например, некоторые из эмодзи), поэтому потребуется больше (в настоящее время 2) символов.

Куча часть становится хуже, друзья мои. UTF-16 не может быть ограничен 16 битами и может расширяться до 32

Если вы используете движок приложений Google, может помочь com.google.appengine.api.datastore.Text. Это позволяет одной строке хранить до 1 мегабайта.

Другие вопросы по тегам