какое значение будет сохранено в строке s
Собеседование по Java — работа со строками (String in Java) (вопросы и ответы)
Список вопросов и ответов для собседования по Java по теме «Работа со строками».
К списку вопросов по всем темам
Вопросы
1. Какие “строковые” классы вы знаете?
2. Какие основные свойства “строковых” классов (их особенности)?
3. Можно ли наследовать строковый тип, почему?
4. Дайте определение понятию конкатенация строк.
5. Как преобразовать строку в число?
6. Как сравнить значение двух строк?
7. Как перевернуть строку?
8. Как работает сравнение двух строк?
9. Как обрезать пробелы в конце строки?
10. Как заменить символ в строке?
11. Как получить часть строки?
12. Дайте определение понятию “пул строк”.
13. Какой метод позволяет выделить подстроку в строке?
14. Как разбить строку на подстроки по заданному разделителю?
15. Какой метод вызывается для преобразования переменной в строку?
16. Как узнать значение конкретного символа строки, зная его порядковый номер в строке?
17. Как найти необходимый символ в строке?
18. Можно ли синхронизировать доступ к строке?
19. Что делает метод intern()?
20. Чем отличаются и что общего у классов String, StringBuffer и StringBuilder?
21. Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer?
22. Почему строка неизменная и финализированная в Java?
23. Почему массив символов предпочтительнее строки для хранения пароля?
24. Почему строка является популярным ключом в HashMap в Java?
25. Напишите метод удаления данного символа из строки.
Ответы
1. Какие “строковые” классы вы знаете?
2. Какие основные свойства “строковых” классов (их особенности)?
Все строковые классы — final (следовательно от них нельзя унаследоваться).
String.
Строка — объект, что представляет последовательность символов. Для создания и манипулирования строками Java платформа предоставляет общедоступный финальный (не может иметь подклассов) класс java.lang.String. Данный класс является неизменяемым (immutable) — созданный объект класса String не может быть изменен.
StringBuffer
Строки являются неизменными, поэтому частая их модификация приводит к созданию новых объектов, что в свою очередь расходует драгоценную память. Для решения этой проблемы был создан класс java.lang.StringBuffer, который позволяет более эффективно работать над модификацией строки. Класс является mutable, то есть изменяемым — используйте его, если Вы хотите изменять содержимое строки. StringBuffer может быть использован в многопоточных средах, так как все необходимые методы являются синхронизированными.
StringBuilder
StringBuilder — класс, что представляет изменяемую последовательность символов. Класс был введен в Java 5 и имеет полностью идентичный API с StringBuffer. Единственное отличие — StringBuilder не синхронизирован. Это означает, что его использование в многопоточных средах нежелательно. Следовательно, если вы работаете с многопоточностью, Вам идеально подходитStringBuffer, иначе используйте StringBuilder, который работает намного быстрее в большинстве реализаций.
Обработка строк в Java. Часть I: String, StringBuffer, StringBuilder: http://habrahabr.ru/post/260767/
3. Можно ли наследовать строковый тип, почему?
Классы объявлены final, поэтому наследоваться не получится.
4. Дайте определение понятию конкатенация строк.
Конкатенация — операция объединения строк, что возвращает новую строку, что является результатом объединения второй строки с окончанием первой. Операции конкатенации могут быть выполнены так:
Сравнение производительности конкатенации строк:
Оператор ‘+=’ > 92.243 с;
String.concat() > 1.254 с;
StringBuffer > 1.208 с;
StringBuilder > 1.121 с.
Конкатенация и настройки JVM: http://microfork.com/string-concatenation-java/
5. Как преобразовать строку в число?
6. Как сравнить значение двух строк?
7. Как перевернуть строку?
8. Как работает сравнение двух строк?
Метод equals сравнивает посимвольно на эквивалентность.
9. Как обрезать пробелы в конце строки?
10. Как заменить символ в строке?
11. Как получить часть строки?
Метод substring(int beginIndex, int lastIndex) — возвращает часть строки по указанным индексам.
12. Дайте определение понятию “пул строк”.
Пул строк – это набор строк, который хранится в памяти Java heap. Мы знаем, что String это специальный класс в Java, и мы можем создавать объекты этого класса, используя оператор new точно так же, как и создавать объекты, предоставляя значение строки в двойных кавычках.
Диаграмма ниже объясняет, как пул строк размещается в памяти Java heap и что происходит, когда мы используем различные способы создания строк.
Пул строк возможен исключительно благодаря неизменяемости строк в Java и реализации идеи интернирования строк. Пул строк также является примером паттерна Приспособленец (Flyweight).
Пул строк помогает экономить большой объем памяти, но с другой стороны создание строки занимает больше времени.
Когда мы используем двойные кавычки для создания строки, сначала ищется строка в пуле с таким же значением, если находится, то просто возвращается ссылка, иначе создается новая строка в пуле, а затем возвращается ссылка.
Тем не менее, когда мы используем оператор new, мы принуждаем класс String создать новый объект строки, а затем мы можем использовать метод intern() для того, чтобы поместить строку в пул, или получить из пула ссылку на другой объект String с таким же значением.
Ниже приведен пример, показывающий работу пула строк.
13. Какой метод позволяет выделить подстроку в строке?
14. Как разбить строку на подстроки по заданному разделителю?
Мы можем использовать метод split(String regex) для разделения строки на массив символов, используя в качестве разделителя регулярное выражение. Метод split(String regex, int numOfStrings) является перегруженным методом для разделения строки на заданное количество строк. Мы можем использовать обратную черту для использования специальных символов регулярных выражений в качестве обычных символов.
15. Какой метод вызывается для преобразования переменной в строку?
16. Как узнать значение конкретного символа строки, зная его порядковый номер в строке?
str.charAt(int i) вернет символ по индексу.
17. Как найти необходимый символ в строке?
str.indexOf(char ch) или lastIndexOf(char c) — вернет индекс первого и последнего вхождения символа.
18. Можно ли синхронизировать доступ к строке?
19. Что делает метод intern()?
20. Чем отличаются и что общего у классов String, StringBuffer и StringBuilder?
В дополнение к ответу вначале приведу сравнение производительности классов.
Сравнение производительности. Linux
Класс | Open JDK 1.6.0_18 | HotSpot 1.6.0_20 | JRockit 4.0.1 |
---|---|---|---|
String | 27390ms | 26850ms | 26940ms |
StringBuffer | 35.55ms | 34.87ms | 15.41ms |
StringBuilder | 33.01ms | 31.78ms | 12.82ms |
Сравнение производительности. Windows XP:
Класс | HotSpot 1.6.0_20 | JRockit 4.0.1 |
---|---|---|
String | 55260ms | 45330ms |
StringBuffer | 19.38ms | 14.50ms |
StringBuilder | 16.83ms | 12.76ms |
21. Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer?
Привести их к одному типу и сравнить.
22. Почему строка неизменная и финализированная в Java?
Есть несколько преимуществ в неизменности строк:
23. Почему массив символов предпочтительнее строки для хранения пароля?
Строка неизменяемая в Java и хранится в пуле строк. С тех пор, как она была создана, она остается в пуле, пока не будет удалена сборщиком мусора, поэтому, когда мы думаем, что закончили работу с паролем, он остается доступным в памяти некоторое время, и нет способа избежать этого. Это риск безопасности, поскольку кто-либо, имеющий доступ к дампу памяти сможет найти пароль в виде чистого текста.
Если мы используем массив символов для хранения пароля, мы можем очистить его после того, как закончим с ним работать. Таким образом, мы можем контролировать, как долго он находится в памяти, что позволяет избежать риска безопасности, свойственного строке.
24. Почему строка является популярным ключом в HashMap в Java?
Поскольку строки неизменны, их хэшкод кэшируется в момент создания, и не требует повторного пересчета. Это делает строки отличным кандидатом для ключа в Map и они обрабатываются быстрее, чем другие объекты-ключи HashMap. Вот почему строки преимущественно используются в качестве ключей HashMap.
25. Напишите метод удаления данного символа из строки.
Мы можем использовать метод replaceAll для замены всех вхождений в строку другой строкой. Обратите внимание на то, что метод получает в качестве аргумента строку, поэтому мы используем класс Character для создания строки из символа, и используем её для замены всех символов на пустую строку.
14.1. Java — Строки и методы класса String
Строки — представляют собой последовательность символов. Строки в Java широко используются и являются объектами.
Платформа Java предоставляет класс строк (class String) для создания и работы со строками.
Содержание
Создание строк
Наиболее простой способ создать строку:
После каждого раза, когда компилятор встречает строковый литерал в коде, он создает строковый объект (String) со значение, в данном случае «Здравствуй, мир!».
Как и в случае с другими объектами, можно создавать строковые объекты, используя ключевое слово new и конструктор. Класс строк имеет одиннадцать конструкторов, которые позволяют обеспечить начальное значение строки, используя различные источники, таких как массив символов.
Пример
Получим следующий результат:
Примечание: Класс строк является неизменяемым, так что как только он будет создан, строковый объект не может быть изменен. Если есть необходимость сделать много изменений в строке символов, следует использовать классы строки буфера (String Buffer) и построитель строки (String Builder Classes).
Длина строки
Методы, используемые для получения информации об объекте, известны как методы доступа. Один из методов доступа, который можно использовать со строками является метод length(), он возвращает количество символов, содержащихся в строковом объекте.
Ниже представлен пример метода length(), который поможет определить длину строки.
Пример
Получим следующий результат:
Объединение строк в Java
Класс строк включает метод для объединения двух строк:
Возвращает новую строку string1, с добавленной строкой string2 в конце. Вы также можете использовать метод concat() со строковыми литералами:
Чаще строки объединяют оператором +:
Давайте посмотрим на следующем примере.
Пример
Получим следующий результат:
Создание формата строк
Мы уже изучали методы printf() и format() для вывода на печать с отформатированными числами. Класс строк в Java обладает эквивалентным методом format(), который возвращает строковый объект, а не потоковый объект (PrintStream).
Использование строкового статического метода format() позволяет создавать строку нужного формата, который можно использовать повторно, в отличие от одноразовых операторов print. Например вместо:
Вы также можете написать:
Методы класса строк
Ниже приведен список методов, поддерживаемых классом строк.
Строки (String) в Java. Особенности, проблемы, пул строк, создание и работа со строками
Строки в Java — это большая, и не такая уж простая тема. Чтобы разобраться в строках, придется потратить некоторое время. Строки отличаются от обычных объектов в Java и имеют свои особенности. Если вы думаете, что разбираетесь в строках, давайте я задам вам один вопрос.
Что выведет данная программа?
Не уверены в ответе? Давайте разбираться подробно и к концу данной статьи вы точно будете знать, что тут происходит.
Что такое строка (string) в Java?
Почему это вообще важно? Представьте, что вам нужно обработать 100.000 строк (например, разобрать по частям какую-нибудь книгу или большую базу данных). Если вы будете каждый раз соединять строки таким образом, то вы создадите в программе огромное количество объектов. Всё это будет работать медленно. Поэтому, если вам нужно много изменять строку, лучше использовать StringBuffer или StringBuilder (я про них еще не писал, поищите информацию в интернете, если интересно).
Я рекомендую хотя бы пролистать официальную документацию по строкам от Oracle, чтобы узнать, какие методы и возможности поддерживает класс String.
Что такое пул строк (string pool) в Java и зачем он нужен?
Пул строк (string pool) в Java, как понятно из описания, это некий пул (или список) объектов класса String, который хранится в специальном месте кучи (Java Heap). Разработчики Java сделали так, чтобы оптимизировать выделение памяти и хранение строк, ускорить и оптимизировать работу с ними.
Пул строк работает следующим образом: когда мы создаем строку с помощью конструкции
Эта строка попадает в пул строк. Когда мы создаем другую строку с тем же значением:
По этой причине следующая конструкция выведет true (вы же не забыли, что мы работаем не с самими объектами, а со ссылками на них?):
Создание строки как нового объекта
В этом случае объект будет создан, причем будет создан в куче. Таким образом следующий код:
Всё происходящее отлично иллюстрируется следующим изображением, которое я нашел в интернете (кто я такой, чтобы что-то рисовать, хаха):
Метод intern() класса String
При создании объекта для новой строки через оператор new мы можем также попросить JVM поискать эту строку в пуле строк с помощью метода intern(), следующим образом:
В данном случае, если у нас уже есть такая строка в пуле строк, то будет возвращена ссылка на строку из пула строк, и новый объект создан не будет.
Основы работы со строками в Python
До сих пор мы обсуждали числа как стандартные типы данных в Python. В этом разделе руководства мы обсудим самый популярный тип данных, то есть строку и методы работы со строками в Python.
Что такое строка в Python?
Строка Python – это набор символов, заключенных в одинарные, двойные или тройные кавычки. Компьютер не понимает персонажей; внутри он хранит манипулируемый символ как комбинацию нулей и единиц.
Каждый символ кодируется символом ASCII или Unicode. Таким образом, мы можем сказать, что строки Python также называются набором символов Unicode.
В Python строки можно создавать, заключая символ или последовательность символов в кавычки. Python позволяет нам использовать одинарные кавычки, двойные кавычки или тройные кавычки для создания строки.
Рассмотрим следующий пример на Python для создания строки.
Проверим тип переменной str с помощью скрипта
В Python строки рассматриваются как последовательность символов, что означает, что Python не поддерживает символьный тип данных; вместо этого одиночный символ, записанный как ‘p’, рассматривается как строка длины 1.
Создание строки в Python
Мы можем создать строку, заключив символы в одинарные или двойные кавычки. Python также предоставляет тройные кавычки для представления строки, но обычно используется для многострочных строк или строк документации.
Индексирование и разбивка строк
Как и в других языках, индексирование строк Python начинается с 0. Например, строка «HELLO» индексируется, как показано на рисунке ниже.
Рассмотрим следующий пример:
Как показано в Python, оператор slice [] используется для доступа к отдельным символам строки. Однако мы можем использовать оператор:(двоеточие) в Python для доступа к подстроке из данной строки. Рассмотрим следующий пример.
Здесь мы должны заметить, что верхний диапазон, указанный в операторе среза, всегда является исключающим, т.е. если задано str = ‘HELLO’, тогда str [1: 3] всегда будет включать str [1] = ‘E’, str [2 ] = ‘L’ и ничего больше.
Рассмотрим следующий пример:
Рассмотрим следующий пример:
Переназначение строк
Обновить содержимое строк так же просто, как присвоить его новой строке. Строковый объект не поддерживает присвоение элемента, т. е. строка может быть заменена только новой строкой, поскольку ее содержимое не может быть частично заменено. Строки неизменяемы в Python.
Рассмотрим следующий пример.
Однако в примере 1 строку str можно полностью присвоить новому содержимому, это указано в следующем примере.
Удаление строки
Как мы знаем, строки неизменяемы. Мы не можем удалить символы из строки. Но мы можем удалить всю строку с помощью ключевого слова del.
Теперь мы удаляем всю строку.
Строковые операторы
Оператор | Описание |
---|---|
+ | Он известен как оператор конкатенации, используемый для соединения строк по обе стороны от оператора. |
* | Известен как оператор повторения. Он объединяет несколько копий одной и той же строки. |
[] | оператор среза. Он используется для доступа к подстрокам определенной строки. |
[:] | оператор среза диапазона, используется для доступа к символам из указанного диапазона. |
in | Оператор членства. Он возвращается, если в указанной строке присутствует определенная подстрока. |
not in | Также является оператором членства и выполняет функцию, обратную in. Он возвращает истину, если в указанной строке отсутствует конкретная подстрока. |
r / R | Используется для указания необработанной строки. Необработанные строки применяются в тех случаях, когда нам нужно вывести фактическое значение escape-символов, таких как «C: // python». Чтобы определить любую строку как необработанную, за символом r или R следует строка. |
% | Необходим для форматирования строк. Применяет спецификаторы формата, используемые в программировании на C, такие как %d или %f, для сопоставления их значений в python. Мы еще обсудим, как выполняется форматирование в Python. |
Рассмотрим следующий пример, чтобы понять реальное использование операторов Python.
Форматирование строки Python
Управляющая последовательность
Предположим, нам нужно написать текст – They said, “Hello what’s going on?” – данный оператор может быть записан в одинарные или двойные кавычки, но он вызовет ошибку SyntaxError, поскольку он содержит как одинарные, так и двойные кавычки.
Рассмотрим следующий пример, чтобы понять реальное использование операторов Python.
Мы можем использовать тройные кавычки для решения этой проблемы, но Python предоставляет escape-последовательность.
Символ обратной косой черты(/) обозначает escape-последовательность. За обратной косой чертой может следовать специальный символ, который интерпретируется по-разному. Одиночные кавычки внутри строки должны быть экранированы. Мы можем применить то же самое, что и в двойных кавычках.
Список escape-последовательностей приведен ниже:
Номер | Последовательность | Описание | Пример |
---|---|---|---|
1. | \newline | Игнорирует новую строку |