Сколько символов может иметь строка 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 мегабайта.