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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

Считаете ли вы использование BigDecimal вместо String для хранения ваших номеров?

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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