Рубрики
Без рубрики

Java Строка Интервью Вопросы и ответы

Подготовьтесь к следующему интервью Java. Сколько из них вы уже знаете?

Автор оригинала: baeldung.

1. Введение

Класс String является одним из наиболее широко используемых классов на Java, что побудило языковых дизайнеров относиться к нему особенно. Такое особенное поведение делает его одной из самых горячих тем в интервью Java.

В этом учебнике, мы будем проходить через некоторые из наиболее распространенных вопросов интервью о Струнные .

2. Основы струн

Этот раздел состоит из вопросов, касаются Струнные внутренней структуры и памяти.

No 1. Что такое строка на Java?

На Яве Струнные представлена внутренне массивом byte значения (или char значения до JDK 9).

В версиях до и включая Java 8, Струнные состоит из непреложного массива символов Unicode. Тем не менее, большинство символов требуют только 8 бит (1 byte) представлять их вместо 16 битов (размер символа).

Для улучшения потребления и производительности памяти Java 9 представила компактные струны . Это означает, что если Струнные содержит только 1-й ряд символов, он будет представлен с помощью Латинский-1 кодировка. Если Струнные содержит по крайней мере 1 многобайтный символ, он будет представлен как 2 байта на символ с использованием кодирования UTF-16.

В C и СЗ, Струнные также массив символов, но в Java, это отдельный объект со своим собственным API.

No 2. Как мы можем создать струнный объект на Java?

java.lang.String определяет 13 различных способов создания Струнные . Как правило, однако, Есть два:

  • Через Струнные буквальный:

  • Через новые ключевое слово:

Все буквы строки в Java являются экземплярами Струнные класс.

В3. Является ли строка примитивным или производным типом?

Струнный является производным типом, так как он имеет состояние и поведение. Например, он имеет такие методы, как субструинг () , indexOf () , и равны (), которые примитивы не могут иметь.

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

  • В то время как строки не хранятся в стеке вызова, как примитивы, они хранится в специальной области памяти под названием строка бассейн
  • Как примитивы, мы можем использовать + оператор на строках
  • И опять же, как примитивы, мы можем создать экземпляр Струнные без новые ключевое слово

No 4. Каковы преимущества струн, которые неизменяемы?

По данным интервью Джеймс Гослинг, строки неизменяемы для повышения производительности и безопасности.

И на самом деле, мы видим несколько преимуществ, имеющих непреложные строки:

  • Пул строк возможен только в том случае, если строки, созданные, никогда не будут изменены, как они должны быть повторно использованы
  • Код может безопасно передать строку другому методу , зная, что он не может быть изменен с помощью этого метода
  • Неизменно автоматически делает этот класс поток-безопасным
  • Поскольку этот класс является безопасным для потоков, нет необходимости синхронизировать общие данные , что, в свою очередь, повышает производительность
  • Так как они гарантированно не изменятся, их хэш-код можно легко кэшировать

В5 евро. Как строка хранится в памяти?

Согласно спецификации СПМ, Струнные буквы хранятся в постоянное время выполнения , который выделяется из средств СПМ область метода .

Хотя область метода логически является частью памяти кучи, спецификация не диктует местоположение, размер памяти или политики сбора мусора. Это может быть конкретной реализацией.

Этот постоянный пул времени выполнения для класса или интерфейса создается, когда класс или интерфейс создается JVM.

No 6. Имеют ли интернированные строки право на сбор мусора на Java?

Да, все Струнные s в пуле строк имеют право на сбор мусора, если нет ссылок из программы.

No7. Что такое струнный постоянный бассейн?

Строка бассейн , также известный как Струнные постоянный бассейн или Струнные стажер бассейн, это особый регион памяти, где JVM Струнные Экземпляров.

Он оптимизирует производительность приложений за счет сокращения количества и количества выделенных строк:

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

No 8. Безопасна ли струнная нить? как?

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

Например, если поток изменяет значение строки, новый струна создается вместо изменения существующего.

No9. Для какой строки операций важно поставлять локале?

Локале класс позволяет нам различать культурные места, а также форматировать наш контент надлежащим образом.

Когда дело доходит до Струнные класса, нам это нужно при визуализации строк в формат или при нижних или верхних оболочках.

В самом деле, если мы забудем сделать это, мы можем сталкиваться с проблемами с переносимостью, безопасностью и удобством использования.

No10. Что такое кодирование основного символа для струнных?

По данным Струнные s Джавадок для версий до и включая Java 8, строки хранятся в формате UTF-16 внутри страны.

char тип данных и java.lang.Character объекты также основаны на оригинальной спецификации Unicode , который определил символы как фиксированной шириной 16-битных сущностей.

Начиная с JDK 9, Струны которые содержат только 1-й день символы используют Латинский-1 кодирования, в то время как Струны с кодированием UTF-16 используется по крайней мере 1 многоярусный символ.

3. Строка API

В этом разделе мы обсудим некоторые вопросы, связанные с Струнные API.

No11. Как мы можем сравнить две строки в Java? В чем разница между str1 и str1. Равные (str2)?

Мы можем сравнить строки двумя различными способами: с помощью равных оператора ( ) и с помощью равны () метод.

Оба сильно отличаются друг от друга:

  • Оператор ( str1 ) проверки на референтного равенства
  • Метод ( str1.equals (str2) ) проверки на лексическое равенство

Хотя, это правда, что если две строки лексически равны, то str1.intern ().интерн() также истинное .

Как правило, для сравнения двух Строки для их содержания, мы всегда должны использовать String.equals .

No12. Как разделить строку на Java?

Струнные сам класс предоставляет нам метод стринг-сплит , который принимает регулярное выражение делимитатор. Это возвращает нам Струнный массив:

String[] parts = "john,peter,mary".split(",");
assertEquals(new String[] { "john", "peter", "mary" }, parts);

Одна сложная вещь о разделенные является то, что при разделении пустой , мы можем получить непустой массив:

assertEquals(new String[] { "" }, "".split(","));

Конечно, разделенные это лишь один из многих способов разделить Java String .

No13. Что такое Stringjoiner?

СтрингДжойнер это класс, введенный в Java 8 для объединения отдельных строк в одну, как принимая список цветов и возвращая их в качестве запятой-делимитации строки . Мы можем поставить делимитр, а также приставку и суффикс:

StringJoiner joiner = new StringJoiner(",", "[", "]");
joiner.add("Red")
  .add("Green")
  .add("Blue");

assertEquals("[Red,Green,Blue]", joiner.toString());

No14. Разница между строкой, Stringbuffer и Stringbuilder?

Струны неизменяемы. Это означает, что если мы попытаемся изменить или изменить его значения, java создать совершенно новый Струнные .

Например, если мы добавим в строку str1 после его создания:

String str1 = "abc";
str1 = str1 + "def";

Тогда JVM, вместо изменения str1 , создает совершенно новую Струнные .

Однако в большинстве простых случаев компилятор внутренне использует Стрингбилдер и оптимизирует вышеуказанный код.

Но для более сложного кода, как петли, это создаст совершенно новую Струнные , ухудшение производительности . Вот где Стрингбилдер и СтрингБуффер полезны.

Оба StringBuilder и StringBuffer в Java создавать объекты, которые держат мутируемую последовательность символов. СтрингБуффер синхронизирована и, следовательно, безопасна для потоков, в то Стрингбилдер Нет.

С момента дополнительной синхронизации в СтрингБуффер как правило, ненужным, мы часто можем получить повышение производительности, выбрав Стрингбилдер.

No15. Почему безопаснее хранить пароли в шаре, а не в строке?

Поскольку строки неизменяемы, они не позволяют модификации. Такое поведение удерживает нас от перезаписи, изменения или обнуливания его содержания, что делает Струны непригодным для хранения конфиденциальной информации.

Мы должны полагаться на сборщик мусора, чтобы удалить содержимое строки. Более того, в Java-версиях 6 и ниже строки хранились в PermGen, что означает, что когда-то Струнные был создан, он никогда не был собран мусор.

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

Использование чара более Струнные не обеспечивает полной защиты информации; это просто дополнительная мера, которая уменьшает возможность для злоумышленника получить доступ к конфиденциальной информации.

No16. Что делает стажер строки () Метод ли?

Метод стажер () создает точную копию струна объект в куче и хранит его в струна постоянный бассейн, который поддерживает JVM.

Java автоматически интернировал все строки, созданные с помощью букватов строк, но если мы создадим Струнные с помощью нового оператора, например, Струнная струна (“азбука”) , затем Java добавляет его в кучу, как и любой другой объект.

Мы можем позвонить стажер () метод, чтобы сказать JVM, чтобы добавить его в пул строк, если он еще не существует там, и вернуть ссылку, что интернированные строки:

String s1 = "Baeldung";
String s2 = new String("Baeldung");
String s3 = new String("Baeldung").intern();

assertThat(s1 == s2).isFalse();
assertThat(s1 == s3).isTrue();

No17. Как мы можем преобразовать строку в Integer и Integer в строку в Java?

Самый простой подход к преобразовать строку в интегра с помощью Интегере parseInt :

int num = Integer.parseInt("22");

Чтобы сделать обратное, мы можем использовать Интегере toString :

String s = Integer.toString(num);

No18. Что такое String.format () и как мы можем его использовать?

String-format возвращает отформатированную строку, используя указанную строку формата и аргументы.

String title = "Baeldung"; 
String formatted = String.format("Title is %s", title);
assertEquals("Title is Baeldung", formatted);

Мы также должны помнить, чтобы указать Локале, если мы не в порядке с просто принятием по умолчанию операционной системы:

Locale usersLocale = Locale.ITALY;
assertEquals("1.024",
  String.format(usersLocale, "There are %,d shirts to choose from. Good luck.", 1024))

No19. Как мы можем преобразовать строку в Uppercase и Lowercase?

Струнные неявно обеспечивает Стринг-toUpperCase изменить корпус на верхний регистр.

Тем не менее, Javadocs напоминают нам, что мы должны указать L окале для обеспечения правильности:

String s = "Welcome to Baeldung!";
assertEquals("WELCOME TO BAELDUNG!", s.toUpperCase(Locale.US));

Аналогичным образом, чтобы преобразовать в нижний регистр, у нас есть String’toLowerCase:

String s = "Welcome to Baeldung!";
assertEquals("welcome to baeldung!", s.toLowerCase(Locale.UK));

No20. Как мы можем получить массив персонажей из строки?

Струнные обеспечивает вчаррай , который возвращает копию своего внутреннего char массив pre-JDK9 (и преобразует Струнные к новому char массив в JDK9:

char[] hello = "hello".toCharArray();
assertArrayEquals(new String[] { 'h', 'e', 'l', 'l', 'o' }, hello);

No 21. Как бы мы преобразоваем Java-строку в массив byte?

По умолчанию метод String’getBytes () кодирует строку в байт-массив с помощью набора символов платформы по умолчанию.

И хотя API не требует, чтобы мы указали набор символов, мы должны для того, чтобы обеспечить безопасность и переносимость:

byte[] byteArray2 = "efgh".getBytes(StandardCharsets.US_ASCII);
byte[] byteArray3 = "ijkl".getBytes("UTF-8");

4. Алгоритмы на основе струн

В этом разделе мы обсудим некоторые вопросы программирования, связанные с Струнные секунда.

No22. Как мы можем проверить, являются ли две строки анаграммами на Java?

Анаграмма – это слово, образованное путем перестановки букв другого данного слова, например, «автомобиль» и «дуга».

Для начала мы сначала проверяем, есть ли оба Струны имеют равную длину или нет.

Затем мы преобразуем их в массив char, сортируем их, а затем проверяем на равенство.

No23. Как мы можем подсчитать количество происшествий данного персонажа в строке?

Java 8 действительно упрощает задачи агрегации, такие как:

long count = "hello".chars().filter(ch -> (char)ch == 'l').count();
assertEquals(2, count);

И, Есть несколько других отличных способов подсчитать l’s , тоже, в том числе петли, рекурсии, регулярные выражения, и внешние библиотеки.

No24. Как мы можем обратить строку в Java?

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

String reversed = new StringBuilder("baeldung").reverse().toString();
assertEquals("gnudleab", reversed);

No25. Как мы можем проверить, если строка Palindrome или нет?

Палиндром — это любая последовательность символов, которая читается так же назад, как и вперед, например «мадам», «радар» или «уровень».

Чтобы проверить, является ли строка палиндромом, мы можем начать итерировать данный строка вперед и назад в одном цикле, по одному персонажу за раз. Цикл выходит при первом несоответствии.

5. Заключение

В этой статье мы прошли через некоторые из наиболее распространенных Струнные интервью вопросы.

Все образцы кода, используемые здесь, доступны на GitHub .