Часті на співбесідах питання по класах колекціям в java (частина 1)

Часті на співбесідах питання по класах колекціям в Java (Частина 1).

Без сумніву, колекції в Java це вкрай важлива область, і питання по колекціях будуть задавати на співбесідах як новачкам так і досвідченим програмістам. Тема настільки велика, що практично неможливо покрити її повністю. І все ж, грунтуючись на моїх попередніх співбесідах, я спробую перелічити якомога більше ХОРОШИХ питань, до яких ви повинні бути готові.
Питання будуть як складні так і прості, так що якщо питання здається вам занадто примітивним - не забувайте що він відмінно підійде менш досвідченому програмісту.

Питання в цій статті:
Загальні питання
Також фреймворк містить інтерфейс Map. який не є спадкоємцем інтерфейсу Collection. Причину чому він не буде наслідувати Collection. ми розберемо в четвертому питанні.
  • Чому колекції не успадковують інтерфейси Cloneable і Serializable?
    Ну, найпростіший відповідь - «бо не треба». Функціонал надається інтерфейсами Cloneable і Serializable просто не потрібен для колекцій.

    Ще одна причина - далеко не завжди потрібен підклас Cloneable бо кожна операція клонування споживає дуже багато пам'яті, і недосвідчені програмісти можуть витрачати її самі не розуміючи наслідків.

    І остання причина - клонування і сериализация є дуже узкоспеціфічнимі операціями, і реалізовувати їх потрібно тільки коли це необхідно. Багато класів колекції реалізують дані інтерфейси, але зовсім нема чого закладати їх для всіх колекцій взагалі. Якщо вам потрібно клонування і сериализация - просто скористайтеся тими класами де вона є, якщо немає - іншими класами.
  • Чому інтерфейс Map не буде наслідувати інтерфейс Collection?
    Хороший відповідь на це питання - «тому що вони несумісні». В інтерфейсі Collection описаний метод add (Object o). Словники не можуть містити цей метод, тому що працюють з парами ключ / значення. Також, словники мають уявлення keySet, valueSet, яких немає в колекціях.

    У зв'язку з цими відмінностями, інтерфейс Map не може успадковувати інтерфейс Collection. і являє собою окрему гілку ієрархії.

    Питання про списки
  • Чому ми використовуємо списки? Які основні класи реалізують інтерфейс List?
    Списки в Java це впорядкована колекція елементів. Кожен елемент має індекс, що починається з нуля. Всі індекси унікальні. Крім методів описаних в інтерфейсі Collection. списки мають свої власні методи, в основному для роботи з елементами колекціями по їх індексу. Можна розділити ці методи на 3 групи - пошук елемента, отримання конкретного елемента, перебір колекції і вибірка підгрупи. Всі ці операції можуть здійснюватися за індексом елемента.

    Основні класи, що реалізують інтерфейс List це Stack, Vector, ArrayList і LinkedList. За більш детальною інформацією щодо них, зверніться до документації.
  • Як перетворити масив рядків в ArrayList?
    Питання це дещо глибше ніж просто з програмування, як це бачиться новачкам. Мета його - перевірити знання кандидатом службових класів фреймворка Collection. Розглянемо два таких класу, найбільш затребуваних на співбесідах - Collections і Arrays. Клас Collections надає статичні методи для операцій над колекціями. Відповідно Arrays надає статичні методи для операцій над масивами.
    Також хотілося б відзначити, що цей метод здатний обробляти не тільки рядки, він створить список елементів будь-якого типу, якого був масив.
  • Як відсортувати список в зворотному порядку?
    Як і попередній, цей питання перевіряє ваше знання службових класів Collection
    Питання про безлічі
  • Чому ми використовуємо безліч таку! Які основні класи реалізують інтерфейс Set?
    Він моделює математичне безліч, з теорії множин. Інтерфейс Set схожий на List. але має деякі відмінності. Перше - це не впорядкована колекція. Отже, додавання / видалення елементів не вимагає їх сортування. Головна особливість множин - унікальність елементів, тобто один і той же елемент не може міститися в безлічі двічі.

    Дуже важливими для функціонування множин є методи equals () і hashCode (). вони дозволяють порівнювати безлічі різних класів. Два безлічі є ідентичними тільки якщо вони містять одні й ті ж елементи.

    Як випливає з вищевикладеного, безлічі не підтримують операцій заснованих на індексі елемента, як списки. Безлічі мають тільки ті методи які описані в інтерфейсі Collection.

    Основними класами, що реалізують інтерфейс Set. є EnumSet, HashSet, LinkedHashSet і TreeSet. Якщо хочете дізнатися більше - почитайте відповідні розділи документації Java.
  • Як зберігаються елементи в HashSet?
    Як ви вже в курсі, HashMap зберігає пари ключ / значення, і ключі повинні бути унікальні. HashSet використовує цю особливість HashMap для забезпечення унікальності своїх елементів. У класі HashSet. словник описаний таким чином:

    Отже, коли ви зберігаєте елемент в множині, воно кладе даний елемент в якості ключа в словник, а значенням йде об'єкт PRESENT, як це описано нижче:

    Я настійно рекомендую вам прочитати цю статтю. це допоможе вам з легкістю відповісти на всі пов'язані з HashMap питання.
  • Чи може елемент null бути доданий в TreeSet або HashSet?
    Як видно з попереднього відповіді, в методі add () немає перевірки на null. Також, HashMap дозволяє один ключ null. отже, один елемент null може бути доданий в HashSet.

    TreeSet працює за тим же принципом що і HashSet. але використовує NavigableMap для зберігання елементів

    NavigableMap це клас-спадкоємець SortedMap. а SortedMap не дозволяє використання ключів null. Отже, і TreeMap не підтримує зберігання елементів типу null. Якщо ви спробуєте додати null в TreeSet. отримаєте виняток NullPointerException.

    Питання про словники
    WeakHashMap це реалізація інтерфейсу Map. яка містить слабкі посилання на елементи. Тобто, якщо за межами WeakHashMap не залишилося жодного посилання на його елемент, цей об'єкт був видалений складальником сміття. Клас призначений для використання з об'єктами, у яких метод equals () перевіряє ідентичність об'єктів за допомогою оператора ==. Після того як елемент буде видалено складальником сміття, він вже не може бути відновлений, і на превеликий подив програміста знайти його в словнику більше не вийде.
  • Поясніть що таке ConcurrentHashMap? Як воно працює?
    Взято з офіційної документації:
    Реалізація словника повністю підтримує багатопотокове додавання / видалення / пошук елементів. Даний клас слід такі самі технічні що і Hashtable, і містить методи відповідні методам Hashtable. Однак, хоча всі операції є потокобезпечна, операція по вибірці елементів не блокує таблицю, і взагалі немає можливості заборонити весь доступ до таблиці. Цей клас сумісний з Hashtable у всьому крім питань багатопотокової синхронізації.
  • Як працює hashmap?
    Найважливіше питання, який швидше за все буде поставлено на співбесіді програмісту будь-якого рівня. Ви повинні добре розбиратися в цій темі, і не тільки тому що це самий задається питання, а й тому що розуміння пристрою hashmap дозволяє вам легше розібратися в інших особливостях роботи колекцій.

    Відповідь на це питання дуже великий, і повністю його можна прочитати в цій статті - як працює hashmap. А на даний момент просто запам'ятайте що HashMap працює на основі хешування. Словник, за визначенням, це об'єкт який пов'язує ключі і значення. Для зберігання таких структур, він використовує внутрішній клас Entry.

    Змінні key і value служать для зберігання ключа і значення. А самі об'єкти Entry лежать в масиві

    Індекс потрібного елемента в масиві обчислюється по хеш-коду ключа. Більше інформації можете отримати за посиланням на початку відповіді.
  • Як створити хороший ключ для словника?
    Наступний хороше запитання, яке зазвичай задають слідом за питанням про функціонування HashMap. Отже, головне обмеження - ключ повинен бути таким, щоб потім по ньому можна було отримати з словника значення. Інакше в його використанні просто немає сенсу. Якщо ви розумієте як функціонує hashmap, ви знаєте що його робота сильно залежить від методів hashCode () і equals () об'єктів-ключів.

    Як випливає з вищевикладеного, хороший ключ повинен давати один і той же hashCode знову і знову, незалежно від того скільки разів він запитується. А також, однакові ключі, при виклику методу equals () повинні повертати true. а різні - false.

    З чого випливає, що кращими кандидатами на роль ключа є незмінні класи.

    TreeMap це особливий різновид HashMap. Різниця в тому, що ключі в TreeMap зберігаються впорядковано. За замовчуванням застосовується «природна сортування». Перевизначити сортування можна надавши екземпляр класу Comparator. метод compare якого і буде використаний для сортування ключів.

    Зверніть увагу, що всі ключі додані в словник повинні реалізовувати інтерфейс Comparable (це необхідно для сортування). Більш того, всі ключі повинні бути взаємно сумісними: k1.compareTo (k2) не повинен викликати ClassCastException для будь-яких k1 і k2 зберігаються в словнику. Якщо користувач спробує покласти в словник ключ який порушує цю умову (наприклад, строковий ключ в словник де всі ключі типу Integer), метод put (Object key, Object value) повинен викликати ClassCastException.

    розмір списку numList після такого конвертування буде незмінним. оскільки як зазначено у Б.Еккеля: «нижчого поданням буде масив, який не допускає зміни розмірів. Виклик add () або delete () для такого списку призведе до спроби зміни розміру масиву, а це призведе до помилки під час виконання ». Іншими словами наш список є всього лише обгорткою вихідного масиву. З JavaDoc про Arrays.asList (): Returns a fixed-size list backed by the specified array.
    А ось така операція:

    вже повертає повноцінну колекцію, яку можна змінювати в розмірах, так як ми вже працюємо з чистим списком.
    Як радив Еккель, ефективніше використовувати методи з Collections.addAll () - цей метод працює значно швидше:

    12502 Новомосковсктеля / 84 топіка

    Прямий ефір

    • Обговорення завдань Тупікова: 2408
      Передплатників: 12441 "class =" js-infobox "> 192.22
    • Переклади Тупікова: 84
      Передплатників: 12502 "class =" js-infobox "> 34.02
    • Новини проекту Тупікова: 199
      Передплатників: 12330 "class =" js-infobox "> 31.86
    • IntelliJ Idea Тупікова: 23
      Передплатників: 12485 "class =" js-infobox "> 21.62
    • Обговорення лекцій Тупікова: 41
      Передплатників: 12478 "class =" js-infobox "> 20.36
    • Патерни Проектування Тупікова: 2
      Передплатників: 26 "class =" js-infobox "> 11.48
    • Говнокод Тупікова: 22
      Передплатників: 70 "class =" js-infobox "> 5.66
    • Статті Тупікова: 75
      Передплатників: 12483 "class =" js-infobox "> 5.66
    • Приклади тестових завдань Тупікова: 6
      Передплатників: 13 "class =" js-infobox "> 4.08
    • Альтанка Тупікова: 110
      Передплатників: 125 "class =" js-infobox "> 3.41