6 ответов:
учитывая
Stringклассаlengthметод возвращаетint, максимальная длина, которая будет возвращена методом будетInteger.MAX_VALUE, которая составляет2^31 - 1(или примерно 2 миллиарда.)С точки зрения длины и индексации массивов (например,
char[], что, вероятно, является способом реализации внутреннего представления данных дляStrings),Глава 10: Массивы на Язык Java Спецификация, Java SE 7 Edition говорит следующее:переменные, содержащиеся в массиве не имеют имен; вместо этого они являются ссылки на выражения доступа к массиву которые используют неотрицательный целочисленный индекс ценности. Эти переменные называются компоненты массива. Если массив имеет
nкомпоненты, мы говоримn- это длина массива; компоненты массива ссылаются, используя целое число индексы от0доn - 1включительно.кроме того, индексация должна быть
intзначения, как указано в 10.4:массивы должны быть индексированы
intценностей;таким образом, кажется, что предел действительно
2^31 - 1, так как это максимальное значение для неотрицательногоintзначение.однако, вероятно, будут и другие ограничения, такие как максимум выделяемый размер для массива.
java.io.DataInput.readUTF()иjava.io.DataOutput.writeUTF(String)скажи, что a
поскольку массивы должны быть индексированы целыми числами, максимальная длина массива
Integer.MAX_INT(231-1, или 2 147 483 647). Это предполагает, что у вас достаточно памяти для хранения массива такого размера, конечно.
возвращаемый тип метода length () класса String -int.
public int length ()
см http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#length()
таким образом, максимальное значение int 2147483647.
строка рассматривается как массив символов внутри, поэтому индексирование выполняется в максимальном диапазоне. Это означает, что мы не можем индексировать Член 2147483648th.Поэтому максимальная длина строки в Java-это 2147483647.
примитивный тип данных int составляет 4 байта (32 бита) в java.As 1 бит (MSB) используется как знаковый бит, диапазон ограничен в пределах -2^31 до 2^31-1 (-2147483648 до 2147483647). Мы не можем использовать отрицательные значения для indexing.So очевидно, что диапазон мы можем использовать от 0 до 2147483647.
у меня есть iMac 2010 с 8 ГБ оперативной памяти, работающий под управлением Eclipse Neon.2 Выпуск (4.6.2) с Java 1.8.0_25. С аргументом VM-Xmx6g я выполнил следующий код:
StringBuilder sb = new StringBuilder(); for (int i = 0; i < Integer.MAX_VALUE; i++) { try { sb.append('a'); } catch (Throwable e) { System.out.println(i); break; } } System.out.println(sb.toString().length());печатается:
Requested array size exceeds VM limit 1207959550таким образом, кажется, что максимальный размер массива составляет ~1,207,959,549. Затем я понял, что нам на самом деле все равно, если Java заканчивается память: мы просто ищем максимальный размер массива (который, кажется, является константой, определенной где-то). Итак:
for (int i = 0; i < 1_000; i++) { try { char[] array = new char[Integer.MAX_VALUE - i]; Arrays.fill(array, 'a'); String string = new String(array); System.out.println(string.length()); } catch (Throwable e) { System.out.println(e.getMessage()); System.out.println("Last: " + (Integer.MAX_VALUE - i)); System.out.println("Last: " + i); } }что отпечатки пальцев:
Requested array size exceeds VM limit Last: 2147483647 Last: 0 Requested array size exceeds VM limit Last: 2147483646 Last: 1 Java heap space Last: 2147483645 Last: 2Итак, кажется, что max является целым числом.MAX_VALUE-2, или (2^31) - 3
P. S. Я не знаю, почему мой
StringBuilderмаксимальное значение1207959550пока мояchar[]максимальное значение при (2^31) -3. Кажется, чтоAbstractStringBuilderудваивает размер его внутреннегоchar[]чтобы вырастить его, так что, вероятно, вызывает проблемы.
Comments