Введение
String
– один из самых широко используемых классов в языке Java. В этой статье представлены некоторые практические вопросы и ответы по String
, которые помогут вам подготовиться к собеседованию.
Вы также можете попробовать Java String Quiz, чтобы проверить свои знания класса String
.
Что представляет собой класс String
в Java? Является ли String
типом данных?
String
– это класс в Java и определен в пакете java.lang
. Это не примитивный тип данных, такой как int
и long
. Класс String
представляет символьные строки. String
используется в практически всех приложениях на Java. String
неизменен и окончательный в Java, и виртуальная машина Java использует пул строк для хранения всех объектов String
. Вы можете создать объект String
, используя двойные кавычки, и перегрузить оператор +
для конкатенации.
Какие существуют различные способы создания объекта String
в Java?
Вы можете создать объект String
, используя оператор new
, или вы можете использовать двойные кавычки для создания объекта String
. Например:
String str = new String("abc");
String str1 = "abc";
В классе String
доступно несколько конструкторов для получения объекта String
из массива символов char
, массива байтов byte
, StringBuffer
и StringBuilder
.
При создании объекта String
с использованием двойных кавычек JVM проверяет строковый пул, чтобы определить, существует ли уже другой объект String
с тем же значением. Если String
уже хранится в пуле, JVM возвращает ссылку на этот объект String
. Если новый String
отсутствует в пуле, JVM создает новый объект String
с заданным значением и сохраняет его в строковом пуле. При использовании оператора new
JVM создает объект String
, но не сохраняет его в строковом пуле. Вы можете использовать метод intern()
для сохранения объекта String
в строковом пуле или для возврата ссылки, если в пуле уже присутствует объект String
с равным значением.
Напишите метод на Java для проверки, является ли входная строка палиндромом.
A string is a palindrome if its value is the same when reversed. For example, aba
is a palindrome string. The String
class doesn’t provide any method to reverse the string but the StringBuffer
and StringBuilder
classes have a reverse()
method that you can use to check whether a string is a palindrome. For example:
private static boolean isPalindrome(String str) {
if (str == null)
return false;
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.reverse();
return strBuilder.toString().equals(str);
}
Иногда интервьюер может запросить, чтобы вы не использовали другие классы для проверки палиндрома. В таком случае вы можете сравнивать символы в строке с обоих концов, чтобы определить, является ли она палиндромом. Например:
private static boolean isPalindromeString(String str) {
if (str == null)
return false;
int length = str.length();
System.out.println(length / 2);
for (int i = 0; i < length / 2; i++) {
if (str.charAt(i) != str.charAt(length - i - 1))
return false;
}
return true;
}
Напишите метод на Java, который удалит указанный символ из объекта строки.
Мы можем использовать метод replaceAll
для замены всех вхождений одной строки другой строкой. Важно отметить, что метод replaceAll()
принимает аргументом String
, поэтому вы можете использовать класс Character
для создания строки и использовать ее для замены всех символов на пустую строку.
private static String removeChar(String str, char c) {
if (str == null)
return null;
return str.replaceAll(Character.toString(c), "");
}
Как сделать строку заглавными или строчными в Java?
Вы можете использовать класс String
и методы toUpperCase
и toLowerCase
, чтобы получить объект String
в верхнем или нижнем регистре. У этих методов есть вариант, который принимает аргумент Locale
и использует правила данной локали для преобразования строки в верхний или нижний регистр.
Что такое метод String subSequence
?
В Java 1.4 был введен интерфейс CharSequence
, и класс String
реализует этот интерфейс, поэтому у класса String
есть метод subSequence
. Внутренне метод subSequence
вызывает метод String substring
.
Как сравнить две строки в программе на Java?
Java String
реализует интерфейс Comparable
, который имеет две вариации метода compareTo()
. Метод compareTo(String anotherString)
сравнивает объект String
лексикографически с переданным аргументом типа String
. Если объект String
предшествует переданному аргументу, возвращается отрицательное целое число, и если объект String
следует за переданным аргументом, возвращается положительное целое число. Возвращает ноль, когда оба объекта String
имеют одинаковое значение. В этом случае метод equals(String str)
также возвращает true
. Метод compareToIgnoreCase(String str)
аналогичен первому, за исключением того, что он игнорирует регистр. Он использует Comparator
с CASE_INSENSITIVE_ORDER
для сравнения без учета регистра. Если значение равно нулю, то equalsIgnoreCase(String str)
также вернет true.
Как конвертировать String
в массив символов в Java?
A String
object is a sequence of characters, so you can’t convert it to a single character. You can use use the charAt
method to get the character at given index or you can use the toCharArray()
method to convert a string to character array. Learn more about converting a string to a character array.
Как конвертировать String
в массив байтов в Java?
Вы можете использовать метод getBytes()
, чтобы преобразовать объект типа String
в массив байтов, и вы можете использовать конструктор new String(byte[] arr)
для преобразования массива байтов в объект типа String
. Узнайте больше о преобразовании строки в массив байтов.
Можно ли использовать String
в операторе switch case в Java?
Java 7 расширила возможности оператора switch case для String
; в более ранних версиях Java это не поддерживается. Если вы реализуете условный поток для строк, вы можете использовать условия if-else, и вы можете использовать оператор switch case, если используете Java 7 или более новые версии. Узнайте больше о строковом операторе switch case в Java.
Напишите программу на Java для вывода всех перестановок строки.
Вам потребуется использовать рекурсию для нахождения всех перестановок строки. Например, перестановки для AAB
это AAB
, ABA
и BAA
. Также вам нужно использовать Set
, чтобы убедиться, что нет дублирующихся значений. Узнайте больше о нахождении всех перестановок строки.
Напишите функцию на Java для нахождения самого длинного палиндрома в заданной строке.
A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.
Какие различия между String
, StringBuffer
и StringBuilder
в Java?
A String
object is immutable and final in Java, so whenever you manipulate a String
object, it creates a new String
object. String manipulations are resource consuming, so Java provides two utility classes for string manipulations, StringBuffer
and StringBuilder
.
StringBuffer
и StringBuilder
– это изменяемые классы. Операции с StringBuffer
являются потокобезопасными и синхронизированными, в то время как операции с StringBuilder
не являются потокобезопасными. В многозадачной среде лучше использовать StringBuffer
, а в однопоточной среде – StringBuilder
. Производительность StringBuilder
выше, чем у StringBuffer
, из-за отсутствия накладных расходов на синхронизацию.
Узнайте больше о различиях между String
, StringBuffer
и StringBuilder
и о бенчмаркинге StringBuffer и StringBuilder.
Почему String
неизменяем в Java?
String
неизменяем в Java, потому что это предлагает несколько преимуществ:
- Пул строк возможен из-за неизменяемости
String
в Java. - Это повышает безопасность, потому что злоумышленник не может изменить его значение, и его можно использовать для хранения конфиденциальной информации, такой как имя пользователя или пароль базы данных.
- Поскольку
String
неизменяем, его безопасно использовать в многозадачных приложениях, и не требуется синхронизация. - Strings используются в загрузчиках классов Java, и немутабельность обеспечивает уверенность в том, что правильный класс загружается с помощью класса
ClassLoader
.
Узнайте больше о том, почему String
является немутабельным в Java.
Как разделить строку в Java?
Вы можете использовать split(String regex)
, чтобы разделить String
на массив String
на основе предоставленного регулярного выражения.
Почему предпочтительнее использовать массив символов перед String
для хранения паролей в Java?
A String
object is immutable in Java and is stored in the string pool. Once it’s created it stays in the pool until garbage collection completes, so even though you’re done with the password it’s available in memory for longer duration. It’s a security risk because anyone having access to memory dump can find the password as clear text. If you use a character array to store password, you can set it to blank once you’re done with it. You can control for how long it’s available in memory and that avoids the security threat.
Как проверить, равны ли две строки в Java?
Есть два способа проверить, равны ли две строки. Вы можете использовать оператор ==
или метод equals()
. Когда вы используете оператор ==
, он проверяет как значение String
, так и ссылку на объект. Часто в программировании на Java вам нужно проверить только равенство значений String
. В этом случае вы должны использовать метод equals()
для проверки равенства двух String
. Существует также функция под названием equalsIgnoreCase
, которую можно использовать для игнорирования регистра.
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println("s1 == s2 ? " + (s1 == s2)); //true
System.out.println("s1 == s3 ? " + (s1 == s3)); //false
System.out.println("s1 equals s3 ? " + (s1.equals(s3))); //true
Что такое пул строк в Java?
Пул строк – это набор объектов String
, хранящихся в памяти кучи Java. String
– это особый класс в Java, и вы можете создавать объекты String
с помощью оператора new
, а также, предоставляя значения в двойных кавычках. Узнайте больше о пуле строк Java.
Что делает метод intern()
в Java?
Когда вызывается метод intern()
, если в пуле уже содержится объект String
, равный этому объекту String
в соответствии с методом equals(Object)
, то возвращается строка из пула. В противном случае этот объект String
добавляется в пул, и возвращается ссылка на этот объект String
. Этот метод всегда возвращает объект String
, содержащий те же данные, что и этот String
, но гарантированно находящийся в пуле уникальных строк.
Является ли String
потокобезопасным в Java?
A String
object is immutable, so you can’t change its value after creation. This makes the String
object thread-safe and so it can be safely used in a multi-threaded environment. Learn more about thread Safety in Java.
Почему String
является популярным ключом HashMap
в Java?
Поскольку объект String
является неизменным, его хэш-код кэшируется в момент создания, и его не нужно вычислять снова. Это делает его отличным кандидатом для ключа в Map, поскольку его обработка быстрее, чем у других объектов ключа HashMap
.
Угадайте вывод
Попробуйте угадать вывод следующих фрагментов кода на Java.
public class StringTest {
public static void main(String[] args) {
String s1 = new String("digitalocean");
String s2 = new String("DIGITALOCEAN");
System.out.println(s1 = s2);
}
}
Output
DIGITALOCEAN
Вывод – DIGITALOCEAN
, потому что код присваивает значение String s2
переменной String s1
. =
– это оператор присваивания, который присваивает значение y
переменной x
в формате (x = y)
. ==
– оператор сравнения, который проверяет, является ли объект ссылкой на одну и ту же строку.
public class Test {
public void foo(String s) {
System.out.println("String");
}
public void foo(StringBuffer sb) {
System.out.println("StringBuffer");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
Output
Test.java:12: error: reference to foo is ambiguous
new Test().foo(null);
^
both method foo(String) in Test and method foo(StringBuffer) in Test match
Этот код приводит к ошибке времени компиляции, потому что обе методы foo
имеют одинаковое имя, и вызов метода foo
в main
передает null
. Компилятор не знает, какой метод вызвать. Вы также можете обратиться к ошибке: метод X неоднозначен для типа Y.
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
Output
false
Выходные данные ложны, потому что код использует оператор `new` для создания объекта `String`, поэтому он создается в куче памяти, и `s1` и `s2` будут иметь разные ссылки. Если вы создаете строки, используя только двойные кавычки, то они будут находиться в пуле строк, и будет выведено `true`.
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
Output
false
Выходные данные ложны, потому что `s2` не является типом `String`. Реализация метода `equals()` в классе `String` содержит оператор `instanceof`, чтобы проверить, является ли тип переданного объекта `String`, и вернуть `false`, если объект не является `String`.
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false
Выходные данные ложны. Метод `intern()` возвращает ссылку на объект `String` из пула строк. Однако код не присваивает его обратно `s2`, и нет изменений в `s2`, поэтому `s1` и `s2` имеют разные ссылки на объект. Если изменить код в строке 3 на `s2 = s2.intern();`, то выходные данные будут `true`.
Сколько объектов `String` создается следующим кодом?
String s1 = new String("Hello");
String s2 = new String("Hello");
Answer
Ответ – три. Код в строке 1 создает объект String
со значением Hello
в пуле строк (первый объект), а затем создает новый объект String
со значением Hello
в куче (второй объект). Код в строке 2 создает новый объект String
со значением Hello
в куче (третий объект) и повторно использует строку Hello
из пула строк.
Вывод
В этой статье вы рассмотрели некоторые вопросы с собеседования по Java, специфически касающиеся String
.
Рекомендуемое чтение:
Вопросы по программированию на Java
Программы со строками на Java
Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers