Вопрос: Максимальная длина строки в 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(не включая сам этот символ).