Максимальная длина строки в методе Java-calling length()



на Java, каков максимальный размер a String объект может иметь, ссылаясь на length() вызов метода?



Я знаю, что length() возвращает размер a String Как char [];

616   6  

6 ответов:

учитывая String класса length метод возвращает int, максимальная длина, которая будет возвращена методом будет Integer.MAX_VALUE, которая составляет 2^31 - 1 (или примерно 2 миллиарда.)

С точки зрения длины и индексации массивов (например,char[], что, вероятно, является способом реализации внутреннего представления данных для String s),Глава 10: Массивы на Язык Java Спецификация, Java SE 7 Edition говорит следующее:

переменные, содержащиеся в массиве не имеют имен; вместо этого они являются ссылки на выражения доступа к массиву которые используют неотрицательный целочисленный индекс ценности. Эти переменные называются компоненты массива. Если массив имеет n компоненты, мы говорим n - это длина массива; компоненты массива ссылаются, используя целое число индексы от 0 до n - 1 включительно.

кроме того, индексация должна быть int значения, как указано в 10.4:

массивы должны быть индексированы int ценностей;

таким образом, кажется, что предел действительно 2^31 - 1, так как это максимальное значение для неотрицательного int значение.

однако, вероятно, будут и другие ограничения, такие как максимум выделяемый размер для массива.

поскольку массивы должны быть индексированы целыми числами, максимальная длина массива Integer.MAX_INT (231-1, или 2 147 483 647). Это предполагает, что у вас достаточно памяти для хранения массива такого размера, конечно.

по-видимому, это связано с int, который является 0x7FFFFFFF (2147483647).

возвращаемый тип метода 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

    Ничего не найдено.