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