Вопросы и ответы на собеседовании по Java String
Введение
String
— один из наиболее широко используемых классов Java. В этой статье приведены некоторые практические вопросы и ответы о String
, которые помогут вам подготовиться к собеседованию.
Вы также можете пройти тест Java String Quiz, чтобы проверить свои знания о классе String
.
Что такое класс String в Java? Является ли String типом данных?
String
— это класс в Java, определенный в пакете java.lang
. Это не примитивный тип данных, такой как int
и long
. Класс String
представляет строки символов. String
используется почти во всех приложениях Java. String
в immutable и final в Java, а JVM использует пул строк для хранения всех объектов String
. Вы можете создать экземпляр объекта String
, используя двойные кавычки, и вы можете перегрузить оператор +
для конкатенации.
Какие существуют способы создания объекта String в Java?
Вы можете создать объект String
с помощью оператора new
или использовать двойные кавычки для создания объекта String
. Например:
String str = new String("abc");
String str1 = "abc";
В классе String
доступно несколько конструкторов для получения String
из массива символов
, массива байтов
, StringBuffer
и StringBuilder
.
Когда вы создаете String
с помощью двойных кавычек, JVM просматривает пул строк, чтобы найти, хранится ли какая-либо другая String
с тем же значением. Если String
уже хранится в пуле, JVM возвращает ссылку на этот объект String
. Если нового String
нет в пуле, JVM создает новый объект String
с заданным значением и сохраняет его в пуле строк. Когда вы используете оператор new
, JVM создает объект String
, но не сохраняет его в пуле строк. Вы можете использовать метод intern()
для сохранения объекта String
в пуле строк или вернуть ссылку, если уже существует String
с равным значением. присутствует в бассейне.
Напишите метод Java, чтобы проверить, является ли входная строка палиндромом.
Строка является палиндромом, если ее значение в обратном порядке остается тем же. Например, aba
— это строка-палиндром. Класс String
не предоставляет никакого метода для обращения строки, но классы StringBuffer
и StringBuilder
имеют метод reverse()
, который можно использовать для проверки того, является ли строка палиндромом. Например:
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), "");
}
Как вы можете сделать верхний или нижний регистр String в 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.
Как преобразовать строку в массив символов в Java?
Объект String
представляет собой последовательность символов, поэтому его нельзя преобразовать в один символ. Вы можете использовать метод charAt
для получения символа по заданному индексу или метод toCharArray()
для преобразования строки в массив символов. Узнайте больше о преобразовании строки в массив символов.
Как преобразовать строку в массив байтов в Java?
Вы можете использовать метод getBytes()
для преобразования объекта String
в массив байтов, и вы можете использовать конструктор new String(byte[] arr)
для преобразования массива байтов в объект String
. Узнайте больше о преобразовании строки в массив байтов.
Можете ли вы использовать String в случае переключения в Java?
В Java 7 возможность переключения регистра расширена до Strings
; более ранние версии Java не поддерживают это. Если вы реализуете условный поток для строк, вы можете использовать условия if-else и регистр переключения, если вы используете Java 7 или более поздние версии. Узнайте больше о строке регистра переключения Java.
Напишите программу на Java для вывода всех перестановок строки.
Вам нужно будет использовать рекурсию, чтобы найти все перестановки строки. Например, варианты AAB
— это AAB
, ABA
и BAA
. Вам также необходимо использовать Set
, чтобы убедиться, что нет повторяющихся значений. Узнайте больше о поиске всех перестановок строки.
Напишите функцию Java для поиска самого длинного палиндрома в заданной строке.
Строка может содержать подстроки-палиндромы. Узнайте больше о том, как найти самую длинную подстроку-палиндром в строке.
В чем разница между String, StringBuffer и StringBuilder в Java?
Объект String
является неизменяемым и окончательным в Java, поэтому всякий раз, когда вы манипулируете объектом String
, он создает новый объект String
. Манипуляции со строками потребляют много ресурсов, поэтому Java предоставляет два служебных класса для манипуляций со строками: StringBuffer
и StringBuilder
.
StringBuffer
и StringBuilder
— это изменяемые классы. Операции StringBuffer
являются потокобезопасными и синхронизированными, в то время как операции StringBuilder
не являются потокобезопасными. Вы должны использовать StringBuffer
в многопоточной среде и использовать StringBuilder
в однопоточной среде. Производительность StringBuilder
выше, чем у StringBuffer
из-за отсутствия накладных расходов на синхронизацию.
Узнайте больше о StringBuffer и StringBuilder.
Почему String неизменяем в Java?
String
неизменяем в Java, потому что это дает несколько преимуществ:
- Пул строк возможен, поскольку
String
неизменяем в Java. - Это повышает безопасность, поскольку любой хакер не может изменить его значение, и оно используется для хранения конфиденциальной информации, такой как имя пользователя или пароль базы данных.
- Поскольку
String
неизменяем, его безопасно использовать в многопоточности, и вам не нужна синхронизация. - Строки используются в загрузчиках классов Java, а неизменность гарантирует, что правильный класс загружается классом
ClassLoader
.
Узнайте больше о том, почему String
неизменяем в Java.
Как разбить строку в Java?
Вы можете использовать split(String regex)
, чтобы разделить String
на массив String
на основе предоставленного регулярного выражения.
Почему массив символов предпочтительнее String для хранения паролей в Java?
Объект String
является неизменяемым в Java и хранится в пуле строк. После создания он остается в пуле до тех пор, пока не завершится сборка мусора, поэтому, даже если вы покончили с паролем, он будет доступен в памяти в течение более длительного времени. Это угроза безопасности, потому что любой, кто имеет доступ к дампу памяти, может найти пароль в виде открытого текста. Если вы используете массив символов для хранения пароля, вы можете установить его пустым, когда закончите с ним. Вы можете контролировать, как долго он будет доступен в памяти, и это позволит избежать угрозы безопасности.
Как вы проверяете, равны ли две строки в 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.
Что делает метод Java String intern()?
Когда вызывается метод intern()
, если пул уже содержит String
, равный этому объекту String
, как определено с помощью equals (Object)
, то возвращается строка из пула. В противном случае этот объект String
добавляется в пул и возвращается ссылка на этот объект String
. Этот метод всегда возвращает объект String
с тем же содержимым, что и этот String
, но гарантированно из пула уникальных строк.
Является ли String потокобезопасным в Java?
Объект String
является неизменяемым, поэтому вы не можете изменить его значение после создания. Это делает объект String
потокобезопасным и поэтому его можно безопасно использовать в многопоточной среде. Узнайте больше о безопасности потоков в Java.
Почему String является популярным ключом HashMap в Java?
Поскольку объект String
является неизменяемым, его хэш-код кэшируется во время создания, и его не нужно вычислять повторно. Это делает его отличным кандидатом на роль ключа в карте, поскольку его обработка выполняется быстрее, чем другие ключевые объекты 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);
}
}
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);
}
}
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
передает нуль
. Компилятор не знает, какой метод вызывать. Вы также можете обратиться к методу X неоднозначно для ошибки типа Y.
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
false
Вывод false
, потому что код использует оператор new
для создания объекта String
, поэтому он создается в куче памяти и s1
и s2
будут иметь другую ссылку. Если вы создаете строки, используя только двойные кавычки, они будут в пуле строк, и он будет печатать true
.
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
false
Вывод false
, поскольку s2
не имеет типа String
. Реализация метода equals()
в классе String
имеет оператор instanceof
для проверки того, является ли тип переданного объекта String
и вернуть false, если объект не String
.
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
false
Вывод false
. Метод intern()
возвращает ссылку на объект String
из пула строк. Однако код не присваивает его обратно s2
, и нет никаких изменений в s2
и, следовательно, s1
и s2
имеют другую ссылку на объект. Если вы измените код в строке 3 на s2=s2.intern();
, вывод будет true
.
Сколько объектов String создается с помощью следующего кода?
String s1 = new String("Hello");
String s2 = new String("Hello");
Ответ три. Код в строке 1 создает объект String
со значением Hello
в пуле строк (первый объект), а затем создает новый объект String
со значением значение Hello
в куче памяти (второй объект). Код в строке 2 создает новый объект String
со значением Hello
в динамической памяти (третий объект) и повторно использует строку Hello
из строки. бассейн.
Заключение
В этой статье вы рассмотрели некоторые вопросы из интервью по Java, посвященные String
.
Рекомендуемое чтение:
Вопросы по программированию на Java