Максимальная длина string java. Вопрос: Максимальная длина строки в Java - метод length (). Структура заголовка объекта

Описание основных методов типа данных 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(не включая сам этот символ).

Которая равна 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 , чтобы увеличить его, что, вероятно, вызывает проблему.

8 ответов

Позвольте мне вначале выделить три разных способа для аналогичной цели.

length - массивы (int , double , String) - знать длину массивов

length() - Связанный с строкой объект (String , StringBuilder и т.д.) - знать длину строки

size() - Объект коллекции (ArrayList , Set и т.д.) - знать размер коллекции

Теперь забудьте о length() рассмотреть только length и size() .

length не является методом, поэтому вполне понятно, что он не будет работать на объектах. Он работает только на массивах.
size() его имя описывает его лучше, и поскольку это метод, он будет использоваться в случае тех объектов, которые работают с коллекцией (фреймворками коллекции), как я уже сказал там.

Теперь переходите к length() :
Строка не является примитивным массивом (поэтому мы не можем использовать.length), а также не коллекцию (поэтому мы не можем использовать.size()), поэтому нам также нужен другой, который является length() (сохраняйте различия и подавайте цель).

Как ответ на Почему?
Я считаю, что это полезно, легко запомнить и использовать и дружелюбно.

Немного упрощенная, вы можете думать об этом как о массивах, которые являются особым случаем, а не обычными классами (немного похожими на примитивы, но нет). Строка и все коллекции являются классами, поэтому методы получения размера, длины или аналогичных вещей.

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

Если кому-то интересно, вот небольшой фрагмент кода, иллюстрирующий разницу между двумя в сгенерированном коде, сначала источник:

Public class LengthTest { public static void main(String args) { int array = {12,1,4}; String string = "Hoo"; System.out.println(array.length); System.out.println(string.length()); } }

Вырезая способ не столь важной части байтового кода, запуск javap -c в классе приводит к следующим двум двум строкам:

20: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream; 23: aload_1 24: arraylength 25: invokevirtual #4; //Method java/io/PrintStream.println:(I)V 28: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream; 31: aload_2 32: invokevirtual #5; //Method java/lang/String.length:()I 35: invokevirtual #4; //Method java/io/PrintStream.println:(I)V

В первом случае (20-25) код просто запрашивает JVM для размера массива (в JNI это было бы вызовом GetArrayLength()), тогда как в случае String (28-35) ему нужно для вызова метода для получения длины.

В середине 90-х годов, без хороших JIT и т.д., он бы полностью уничтожил производительность, чтобы иметь только java.util.Vector(или что-то подобное), а не конструкцию языка, которая на самом деле не вела себя как класс, но была быстро. Разумеется, они могли маскировать свойство как вызов метода и обрабатывать его в компиляторе, но я думаю, что было бы еще более запутанным иметь метод для чего-то, что не является реальным классом.

Int myArray = new int; String myString = "hello world!"; List myList = new ArrayList(); myArray.length //gives the length of the array myString.length() //gives the length of the string myList.size() //gives the length of the list

Скорее всего, строки и массивы были спроектированы в разное время и, следовательно, были использованы в разных соглашениях. Одно из обоснований заключается в том, что, поскольку в Strings используются внутренние массивы, метод length() использовался во избежание дублирования одной и той же информации. Другим является то, что использование метода length() помогает подчеркнуть неизменность строк, даже если размер массива также неизменен.

В конечном счете это просто непоследовательно, что эволюционировало, что определенно было бы исправлено, если бы язык был перепроектирован с нуля. Насколько я знаю, никакие другие языки (С#, python, scala и т.д.) Не делают то же самое, так что это скорее всего небольшой недостаток, который оказался частью языка.

Вы получите сообщение об ошибке, если в любом случае вы используете неверный.: P: D

В Java массив хранит свою длину отдельно от структуры, которая фактически хранит данные. Когда вы создаете массив, вы указываете его длину и становится определяющим атрибутом массива. Независимо от того, что вы делаете с массивом длины N (значения изменения, нулевые значения и т.д.), Он всегда будет массивом длины N.

Длина строки является случайной; это не атрибут String, а побочный продукт. Хотя Java-строки на самом деле неизменяемы, если бы можно было изменить их содержимое, вы могли бы изменить их длину. Сбрасывание последнего символа (если это было возможно) уменьшило бы длину.

Я понимаю, что это прекрасное различие, и я могу проголосовать за него, но это правда. Если я делаю массив длиной 4, эта длина 4 является определяющей характеристикой массива и истинна независимо от того, что удерживается внутри. Если я создаю строку, содержащую "собак", эта строка имеет длину 4, потому что она содержит четыре символа.

Я рассматриваю это как оправдание для того, чтобы сделать одно с атрибутом, а другое - с помощью метода. По правде говоря, это может быть непреднамеренная несогласованность, но это всегда имело смысл для меня, и это всегда так, как я думал об этом.

Мне научили, что для массивов длина не извлекается методом из-за следующего страха: программисты просто назначили длину локальной переменной перед входом в цикл (подумайте о цикле for, где условное использует длину массива.) Программист предположительно сделает это, чтобы обрезать вызовы функций (и тем самым повысить производительность). Проблема в том, что длина может измениться во время цикла, а переменная не будет.

Всякий раз, когда создается массив, его размер задается. Таким образом, длину можно рассматривать как атрибут конструкции. Для String это по существу массив char. Длина является свойством массива char. Нет необходимости ставить длину как поле, потому что не все нуждается в этом поле. http://www.programcreek.com/2013/11/start-from-length-length-in-java/

Я согласен с Fredrik, что лучший выбор для оптимизатора компилятора. Это также решит проблему: даже если вы используете свойство для массивов, вы не решили проблему для строк и других (неизменяемых) типов коллекций, потому что, например, string основывается на массиве char , поскольку вы можно увидеть в определении класса string:

Public final class String implements java.io.Serializable, Comparable, CharSequence { private final char value; // ...

И я не согласен с тем, что это будет еще более запутанным, потому что массив наследует все методы из java.lang.Object .

Как инженер, мне действительно не нравится ответ "Потому что это всегда было так". и пожелал бы лучшего ответа. Но в этом случае это похоже.

По-моему, это дизайнерский недостаток Java и не должен реализовываться таким образом.

Привычным способом Java сравнения строк является лексикографический способ, реализованный в методе compareTo() класса String . Но иногда нужно сравнить строки по их длине. По умолчанию нельзя использовать для этого метод compareTo() . Вместо этого нужно написать собственный метод, который вычисляет длину строк с помощью метода length() и сравнивает их. Такой метод должен возвращать положительное значение, если первая String имеет длину больше второй; отрицательное значение, если длина первой String меньше длины второй и ноль, если обе String имеют одинаковую длину.

Можно определить такой одноразовый метод, используя анонимный внутренний класс, и далее использовать его для сортировки списка строк по длине. Это метод хорошо работает в Java 6 и 7 , но в Java 8 он работает еще лучше из-за меньшего количества помех благодаря новой функции, называемой лямбда-выражения.

Вот как можно сделать это в более ранних версиях Java :

public int compare(String s1, String s2) { return s1.length() - s2.length(); }

Сравнение длины строк arraylist в Java 8 можно сделать еще проще, используя лямбда-выражение и новые методы по умолчанию, добавленные в класс java.util.Comparator :

Comparator strlenComp = (a, b) -> Integer.compare(a.length(), b.length());

a и b — это два объекта String. Integer.compare() — это новый метод, добавленный в Java 8 . Поскольку мы используем компаратор для строк, компилятор в состоянии выводить типы a и b , которые являются String .

Ниже приведен пример использования этого компаратора длины строк для сортировки списка строк по их длине. В этом примере мы продемонстрировали программы на JDK 6 и 7 с использованием анонимного класса, и новый способ с использованием лямбда-выражений, который доступен в Java 8 . Он занимает всего одну строку и его намного проще понять, если вы знакомы с синтаксисом лямбда-выражений.

Как отсортировать список строк по их длине в Java 7 и 8

Java 6, 7

Import java.util.ArrayList; Import java.util.Arrays; Import java.util.Collections; Import java.util.Comparator; Import java.util.List; / * * Программа Java для сортировки списка строк по их длине * / public class StringComparisonByLength{ Public static void main (String args) { List books = new ArrayList<>(Arrays.asList("Effective Java", "Algorithms", "Refactoring")); System.out.println("Sorting List of String by length in JDK 7 ======"); System.out.println("The original list without sorting"); System.out.println(books); Comparator byLength = new Comparator(){ @Override Public int compare (String s1, String s2) { Return s1.length () - s2.length (); } }; Collections.sort(books, byLength); System.out.println("The same list after sorting string by length"); System.out.println(books); } }

Результат

Sorting List of String by length in JDK 7 ====== The original list without sorting The same list after sorting string by length

Java 8

Import java.util.ArrayList; Import java.util.Arrays; Import java.util.Comparator; Import java.util.List; / * * Программа Java для сортировки списка строк по их длине в JDK 8 * / public class SortingListOfStringByLength{ public static void main(String args) { // В Java 8 System.out.println("Sorting List of String by length in Java 8 ======"); List cities = new ArrayList<>(Arrays.asList("London", "Tokyo", "NewYork")); System.out.println("The original list without sorting"); System.out.println(cities); cities.sort((first, second) -> Integer.compare(first.length(), second.length())); System.out.println("The same list after sorting string by length"); System.out.println(cities); } }

Результат

Sorting List of String by length in Java 8 ====== The original list without sorting The same list after sorting string by length

Это все, что касается сравнения длины строк Java и сортировки списка String по длине в Java 7 и Java 8 . В последней версии языка делать это намного удобнее, поскольку можно создать пользовательский компаратор только одной строкой, используя лямбда-выражение. API JDK 8 содержит множество подобных методов, которые облегчают еще более сложные сравнения. Например, используя метод thenComparing() , можно связать несколько компараторов.

Перевод статьи «How to compare String by their length in Java 7 and 8 » дружной командой проекта

В этом уроке мы научимся работать со строками в 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() можно создать стоковый шаблон, который можно повторно использовать, например, вместо этого: можно использовать этот код: На этом всё! :) Ссылка на перво


Top