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

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

я знаю это length() вернуть размер String как char ;


2018-05-03 02:35

Массивы должны индексироваться int значения;

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

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


2018-05-03 02:34

Таким образом, максимальное значение int 2147483647 ,

Строка считается внутренним массивом символов, поэтому индексирование выполняется в пределах максимального диапазона. Это означает, что мы не можем индексировать 2147483648-й член. Таким образом, максимальная длина строки в java равна 2147483647.

Примитивный тип данных int - 4 байта (32 бита) в java. В качестве 1 бита (MSB) используется как бит знака , Диапазон ограничен в пределах -2 ^ 31 до 2 ^ 31-1 (От -2147483648 до 2147483647). Мы не можем использовать отрицательные значения для индексации. Очевидно, что диапазон, который мы можем использовать, составляет от 0 до 2147483647.


У меня есть iMac 2010 года с 8 ГБ оперативной памяти, запуск Eclipse Neon.2 Release (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

Таким образом, кажется, что максимальный размер массива составляет ~ 1207,959,549. Затем я понял, что на самом деле нам неинтересно, что в Java заканчивается память: мы просто ищем максимальный размер массива (который, как представляется, определен как константа). Так:

For (int i = 0; i < 1_000; i++) { try { char array = new char; 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 - Integer.MAX_VALUE - 2, или (2 ^ 31) - 3

Постскриптум Я не уверен, почему мой StringBuilder увеличен на 1207959550 тогда как мой char максимизировано при (2 ^ 31) -3. Кажется, что AbstractStringBuilder удваивает размер его внутреннего char чтобы вырастить его, так что, вероятно, проблема.


Которая равна 2^31 - 1 (или около 2 миллиардов.)

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

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

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

Массивы должны индексироваться значениями int ;

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

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

Тип возвращаемого значения метода length() класса String int .

Таким образом, максимальное значение int 2147483647 .

Строка считается внутренним массивом char, поэтому индексирование выполняется в пределах максимального диапазона. Это означает, что мы не можем индексировать 2147483648-й член. Таким образом, максимальная длина строки в java равна 2147483647.

Примитивный тип данных int - 4 байта (32 бита) в java. В качестве знакового бита используется 1 бит (MSB). Диапазон ограничен в пределах от -2 ^ 31 до 2 ^ 31-1 (-2147483648 до 2147483647).). Мы не можем использовать отрицательные значения для индексации. Очевидно, что диапазон, который мы можем использовать, составляет от 0 до 2147483647.

У меня есть iMac 2010 года с 8 ГБ ОЗУ, запускающий Eclipse Neon.2 Release (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

Итак, кажется, что максимальный размер массива составляет ~ 1207,959,549. Затем я понял, что на самом деле нам неинтересно, что в Java заканчивается память: мы просто ищем максимальный размер массива (который, как представляется, определен как константа). Итак:

For (int i = 0; i < 1_000; i++) { try { char array = new char; 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 является Integer.MAX_VALUE - 2, или (2 ^ 31) - 3

P.S. Я не уверен, почему мой StringBuilder достиг максимума в 1207959550 , а мой char превысил отметку (2 ^ 31) -3. Кажется, что AbstractStringBuilder удваивает размер своего внутреннего char , чтобы увеличить его, что, вероятно, вызывает проблему.

В этом уроке мы научимся работать со строками в Java. Строки, которые так широко используются в программировании представляют из себя последовательность символов. В языке программирования Java строки - это объект. Платформа Java предоставляет класс String для создания и управления строками.

Создание строк

Самый простой способ создания строки выглядит так: String greeting = "Hello world!" ; В данном случае «Hello World!» - это строковый литерал (т.е. константа) состоящая из последовательности символов, заключенных в кавычки. Всякий раз, когда компилятор сталкивается со строковым литералом, он создает объект типа String со значением, в нашем случае, «Hello World!». Как и любой другой объект, строку можно создать, используя ключевое слово new . Класс String имеет три конструктора, которые позволяют создавать объект, используя разные источники, например, массив символов. Последняя строка примера выведет на экран hello . Класс String является неизменяемым, поэтому один раз создав объект, мы не сможем его изменить. Некоторые методы, которые мы рассмотрим ниже, позволяют это исправить. Т.к. String неизменяем, эти методы создают и возвращают новую строку, содержащую результат операции.

Длина строки

Методы для получения информации о строке называются методами доступа. Один из этих методов length() . Он возвращает количество символов в строке. В следующем примере len будет равно 17: Переменная palindrome содержит палиндром, т.е. слово или предложение, которое одинаково читается в обе стороны. Напишем небольшую программу, которая перевернет палиндром. Мы будем использовать метод charAt(i) , который возвращает i -й символ строки, начиная с 0. Программа выведет doT saw I was toD Для того чтобы перевернуть строку, мы сначала создали из строки массив символов (первый цикл), затем создали новый массив, в который записали перевернутый первый массив, далее создали новую строку. Класс String содержит метод getChars() , который возвращает массив символов, поэтому первый цикл можно заменить строкой: palindrome. getChars (0 , len, tempCharArray, 0 ) ;

Конкатенация строк

Класс String реализует метод соединения двух строк: string1. concat (string2) ; Данный код вернет новую строку, содержащую string1 и присоединенную к ней string2 . Также можно использовать данный метод со строковыми литералами: "My name is " . concat ("Rumplestiltskin" ) ; Чаще строки соединяют с помощью оператора « + », пример: "Hello," + " world" + "!" В результате получится строка «Hello, world! ». Оператор « + » широко используется для вывода информации, например: String string1 = "saw I was " ; System. out. println ("Dot " + string1 + "Tod" ) ; Код выведет «Dot saw I was Tod ». Подобная конкатенация может быть использована в связке с любыми другими объектами. Для объектов не являющимися строками будет вызван метод toString() , который конвертирует их в строки. Задаем формат вывода строк Мы уже рассматривали методы printf() и format() когда форматировали вывод чисел. Класс String имеет аналогичный метод, который возвращает строку. Используя статический метод format() можно создать стоковый шаблон, который можно повторно использовать, например, вместо этого: можно использовать этот код: На этом всё! :) Ссылка на перво

Описание основных методов типа данных String.
Для работы со строками в Java используется тип данных String.
Инициализация
Инициализируется этот тип данных также как и остальные примитивные типы.
String a;
Создаст новый объект типа String со значением по умолчанию равным null.
Команда
a = "Строка";
Запишет в переменную a слово Строка.
String и char
Строку в Java можно рассматривать как некий массив символов типа char. Поэтому в Java есть простые способы получения каких-либо символов из строки. Пусть имеется переменная b типа char.
Команда
int I = a.indexOf(b);
Запишет в I номер первого вхождения символа b в встречаемой строке. Обратите внимание, что нумерация символов начинается не с 1 а с 0, поэтому если в приведенном выше примере символ b будет равен букве C, то в переменную I будет записано значение 0. В случае если искомый символ не встречается в строке, в переменную I будет записано значение -1.

Оператор lastIndexOf работает по тому же принципу, но возвращает номер последнего вхождения символа в строку.

Пусть имеется int i.
Команда
char c = a.charAt(i);
Запишет в переменную c символ стоящий на i-м месте в строке a. Здесь тоже не стоит забывать про особенности нумерации в Java. Если же длина строки меньше чем значение i, то программа рассмотрит такую попытку обращения как ошибку.
Получить длину строки(количество символов в ней) можно следующим образом:
Команда
Int I = a.length();
Запишет в переменную I длину строки a.

Также можно заменить все вхождения какого-либо символа в строку на другой символ. Пусть у нас есть строка a2, и нам нужно заменить все символы b1 на символ b2 и записать полученный результат в строку a1 . Это осуществляется с помощью следующей команды:

a1 = a2.replace(b1, b2);
Стоит заметить что если нужно заменить все элементы в исходной строке, без создания новой, то можно написать
a1 = a1.replace(b1, b2);
В Java также существует легкий способ переводить все символы в строке из нижнего регистра в верхний, и наоборот.
Команда
a = a.toLowerCase();
Заменит все символы верхнего регистра на символы нижнего регистра. Например, если мы применим этот оператор к строке из первого примера, то на выходе получим слово “строка”.

Оператор toUpperCase делает обратное, то есть в случае приведённого выше примера значение строки a станет “СТРОКА”.

Работа со строками
Также мы можем складывать строки друг с другом, сравнивать их, и получать подстроку данной строки.

Складывать строки можно также как и остальные примитивные типы данных. Пусть имеются строки а1 и а2, и их значения — “Стр” и “ока” соответственно.

Команда
a = a1 + a2;
Запишет в строку а1 слово “Строка”, являющееся “суммой” строк a1 и a2. Тот же самый результат будет при использовании команды
a = a1.concat(a2);
Команда
Int I = a1.compareTo(a2);
Запишет в переменную I значение меньше нуля в случае если лексикографически строка a1 меньше строки a2, и вернет значение большее нуля в обратном случае. Если же a1 лексикографически эквивалентна a2 то в I будет записано значение 0.
Пусть имеется строка a и число i.
Команда
String a1 = a.substring(i);
Запишет в строку a1 всю ту часть строки a которая начинается с символа с номером i. Также можно огранить подстроку и с другой стороны. Пусть у нас также имеется число j.
В таком случае команда
String a1 = a.substring(i, j);
Запишет в строку a1 часть строки a начинающуюся с символа с номером I и идущую до символа с номером j(не включая сам этот символ).