Поиск по сайту:

Вопросы и ответы на собеседовании по 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