Співбесіда по 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. Які "строкові" класи ви знаєте?

  • public final class String implements java.io.Serializable, Comparable, CharSequence
  • public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
  • public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence

2. Які основні властивості "строкових" класів (їх особливості)?

Всі рядкові класи - final (отже від них не можна успадкувати).

String.
Рядок - об'єкт, що представляє послідовність символів. Для створення і маніпулювання рядками Java платформа надає загальнодоступний фінальний (не може мати підкласів) клас java.lang.String. Даний клас є незмінним (immutable) - створений об'єкт класу String не може бути змінений.

StringBuffer
Рядки є незмінними, тому часта їх модифікація призводить до створення нових об'єктів, що в свою чергу витрачає дорогоцінну пам'ять. Для вирішення цієї проблеми було створено клас java.lang.StringBuffer. який дозволяє більш ефективно працювати над модифікацією рядки. Клас є mutable. тобто змінним - використовуйте його, якщо Ви хочете змінювати вміст рядка. StringBuffer може бути використаний в багатопоточних середовищах, так як всі необхідні методи є синхронізованими.

StringBuilder
StringBuilder - клас, що представляє змінну послідовність символів. Клас був введений в Java 5 і має повністю ідентичний API з StringBuffer. Єдина відмінність - StringBuilder відсутня синхронізація. Це означає, що його використання в багатопоточних середовищах небажано. Отже, якщо ви працюєте з багатопоточність, Вам ідеально подходітStringBuffer. інакше використовуйте StringBuilder. який працює набагато швидше в більшості реалізацій.

3. Чи можна успадкувати строковий тип, чому?

Класи оголошені final, тому успадковуватися не вийде.

4. Дайте визначення поняттю конкатенація рядків.

Конкатенація - операція об'єднання рядків, що повертає новий рядок, що є результатом об'єднання другого рядка з закінченням першої. Операції конкатенації можуть бути виконані так:

12. Дайте визначення поняттю "пул рядків".

Пул рядків - це набір рядків, який зберігається в пам'яті Java heap. Ми знаємо, що String це спеціальний клас в Java, і ми можемо створювати об'єкти цього класу, використовуючи оператор new точно так же, як і створювати об'єкти, надаючи значення рядка в подвійних лапках.
Діаграма нижче пояснює, як пул рядків розміщується в пам'яті Java heap і що відбувається, коли ми використовуємо різні способи створення рядків.

Співбесіда по java - робота з рядками (string in java) (питання і відповіді)

Нижче наведено приклад, що показує роботу пулу рядків.

21. Як правильно порівняти значення рядків двох різних об'єктів типу String і StringBuffer?

Привести їх до одного типу і порівняти.

22. Чому рядок незмінна і фіналізували в Java?

Є кілька переваг у незмінності рядків:

23. Чому масив символів краще рядка для зберігання пароля?

Рядок незмінна в Java і зберігається в пулі рядків. З тих пір, як вона була створена, вона залишається в пулі, поки не буде видалена складальником сміття, тому, коли ми думаємо, що закінчили роботу з паролем, він залишається доступним в пам'яті деякий час, і немає способу уникнути цього. Це ризик безпеки, оскільки будь-хто, хто має доступ до дампи пам'яті зможе знайти пароль у вигляді чистого тексту.
Якщо ми використовуємо масив символів для зберігання пароля, ми можемо очистити його після того, як закінчимо з ним працювати. Таким чином, ми можемо контролювати, як довго він знаходиться в пам'яті, що дозволяє уникнути ризику безпеки, властивого рядку.

24. Чому рядок є популярним ключем в HashMap в Java?

Оскільки рядки незмінні, їх хешкод кешируєтся в момент створення, і не вимагає повторного перерахунку. Це робить рядки відмінним кандидатом для ключа в Map і вони обробляються швидше, ніж інші об'єкти-ключі HashMap. Ось чому рядки переважно використовуються в якості ключів HashMap.

25. Напишіть метод видалення даного символу з рядка.

Ми можемо використовувати метод replaceAll для заміни всіх входжень в рядок інший рядком. Зверніть увагу на те, що метод отримує в якості аргументу рядок, тому ми використовуємо клас Character для створення рядка з символу, і використовуємо її для заміни всіх символів на порожній рядок.