JavaRush /Java блог /Random UA /Часті запитання щодо класів колекцій в Java (Частина 2)
theGrass
24 рівень
Саратов

Часті запитання щодо класів колекцій в Java (Частина 2)

Стаття з групи Random UA
Часті питання на класах колекцій в Java (Частина 2) - 1Питання про відмінності різних колекцій
  1. Назвіть різницю між Setі List?
  2. Назвіть різницю між Listі Map?
  3. Назвіть різницю між HashMapіHashTable?
  4. Назвіть різницю між Vectorі ArrayList?
  5. Назвіть різницю між Iteratorі Enumeration?
  6. Назвіть різницю між HashMapі HashSet?
  7. Назвіть різницю між Iteratorі ListIterator?
  8. Назвіть різницю між TreeSetі SortedSet?
  9. Назвіть різницю між ArrayListі LinkedList?
І ще питання
  1. Як зробити колекцію лише для читання?
  2. Як зробити потокобезпечну колекцію?
  3. Чому не існує методу Iterator.add()додавання елементів до колекції?
  4. Які є способи перебирати елементи списку?
  5. Як ви розумієте роботу якості ітератора fail-fast?
  6. Яка різниця між fail-fastі fail-safe?
  7. Як уникнути ConcurrentModificationExceptionпід час перебору колекції?
  8. Що таке UnsupportedOperationException?
  9. Які класи колекцій дають доступ до будь-якого елемента?
  10. Що таке BlockingQueue?
  11. Що таке черга та стек, перерахуйте різницю між ними?
  12. Що таке інтерфейси Comparableта Comparator?
  13. Що таке класи Collectionsта Arrays?
  14. Список використаної літератури
Не марнуючи час, приступимо до пояснень

Питання про відмінності різних колекцій

  1. Назвіть різницю між Setі List?

    Список ключових відмінностей:
    Безліч - неупорядковані колекції, тоді як списки - впорядковані, де кожен елемент має індекс, що починається з нуля. Списки можуть містити два і більше однакові елементи, а безліч не можуть. У списку може міститися скільки завгодно елементів null, у безлічі лише один.

  2. Назвіть різницю між Listі Map?

    Найлегше питання. Список це колекція елементів, а словник це колекція пар ключ/значення. Є ще безліч змін, але всі вони є наслідком цього. Вони мають різний інтерфейс верхнього рівня, різний набір методів і різні представлення даних. У більшості випадків достатньо лише першої відповіді.

  3. Назвіть різницю між HashMapі HashTable?

    Є кілька відмінностей між HashMapі HashTableJava:

    • HashTableпотокобезпечна, а HashMapні
    • HashTableне може містити елементи null, тоді як HashMapможе містити один ключ nullі будь-яку кількість значеньnull
    • Третя ключова відмінність між ними — ітератор HashMap, на відміну від перелічувача HashTable, працює за принципом fail-fast(видає виняток за будь-якої неузгодженості даних)

  4. Назвіть різницю між Vectorі ArrayList?

    Зазначимо деякі відмінності:

    • Усі методи Vectorпотокобезпечні, а у ArrayList- ні
    • Vectorце застарілий клас доданий у першому релізі JDK. ArrayListз'явився в JDK 1.2, разом з іншими класами фреймворкуCollection
    • За замовчуванням Vectorподвоює свій розмір, коли закінчується виділена під елементи пам'ять. ArrayListж збільшує свій розмір лише на половину

  5. Назвіть різницю між Iteratorі Enumeration?

    Ітератори відрізняються від перелічників за трьома ознаками:

    • Існують ітератори, які дозволяють видаляти елементи зі своєї колекції під час перебору з використанням методу remove(). Клас Iteratorданого функціоналу не підтримує. За допомогою перелічувача не можна додавати/вилучати елементи
    • Перелічувачі присутні у застарілих класах, таких як Vector/Stack, тоді як ітератори є у всіх сучасних класах-колекціях
    • Ще невелика відмінність у цьому, що з ітераторів і перелічувачів відрізняється найменування способів, тобто Enumeration.hasMoreElements()відповідає Iterator.hasNext()і Enumeration.nextElement()відповідає Iterator.next()і т.д.

  6. Назвіть різницю між HashMapі HashSet?

    HashMap— колекція пар ключ/значення, тоді як HashSetупорядкована колекція унікальних елементів. І це все, не потрібно більше жодних пояснень.

  7. Назвіть різницю між Iteratorі ListIterator?

    Є три відмінності:

    • Iteratorможе використовуватися для перебору елементів Setі ListMap . На відміну від нього ListIteratorможе бути використаний тільки для перебору елементів колекції.List
    • Iteratorдозволяє перебирати елементи лише одному напрямку, з допомогою методу next(). Тоді як ListIteratorдозволяє перебирати список в обох напрямках, за допомогою методів next()іprevious()
    • За допомогою ListIteratorви можете модифікувати список, додаючи/видаляючи елементи за допомогою методів add()та remove(). Iteratorне підтримує цього функціоналу

  8. Назвіть різницю між TreeSet і SortedSet?

    SortedSetце інтерфейс, що реалізується класом TreeSet. От і все!

  9. Назвіть різницю між ArrayListі LinkedList?
    • LinkedListзберігає елементи у двозв'язному списку, тоді як ArrayListзберігає їх у масиві, розмір якого може динамічно змінюватися
    • LinkedListпідтримує додавання/видалення елементів за фіксований час, але лише послідовний доступ до елементів. Тобто ви можете перебрати список з початку в кінець і з кінця в початок, але отримання елемента в середині списку займе час пропорційне розміру списку. ArrayListА дозволяє отримати будь-який елемент за його індексом за фіксований час. Але додавання/видалення елементів туди вимагає витрат часу пропорційних розміру, тому що потрібно посунути всі елементи з місця вставки/видалення і до кінця списку, або щоб звільнити місце для вставляння або щоб прибрати пропуск на місці віддаленого
    • LinkedListвимагає більше пам'яті для зберігання такої ж кількості елементів, тому що крім самого елемента зберігаються ще покажчики на наступний та попередній елементи списку, тоді як елементи ArrayListпросто йдуть по порядку

І ще питання

  1. Як зробити колекцію лише для читання?

    Використовуйте такі методи:

    • Collections.unmodifiableList(list);
    • Collections.unmodifiableSet(set);
    • Collections.unmodifiableMap(map);

    Всі вони приймають колекцію як параметр і повертають колекцію тільки для читання з тими ж елементами всередині.

  2. Як зробити потокобезпечну колекцію?

    Використовуйте такі методи:

    • Collections.synchronizedList(list);
    • Collections.synchronizedSet(set);
    • Collections.synchronizedMap(map);

    Усі вони приймають колекцію як параметр, і повертають потокобезопасную колекцію з тими самими елементами всередині.

  3. Чому не існує методу Iterator.add()додавання елементів до колекції?

    Єдине завдання ітератора – це перебір колекції. Кожна колекція має метод add(), яким ви можете скористатися. Немає сенсу додавати цей метод до ітератора, тому що колекції можуть бути впорядкованими та невпорядкованими, і метод add()при цьому має бути влаштований по-різному.

  4. Які є способи перебирати елементи списку?

    Є 4 способи:

    • Цикл із ітератором
    • Циклfor
    • Розширений цикл for
    • Циклwhile
    Читайте статтю .

  5. Як ви розумієте роботу якості ітератора fail-fast?

    Ітератор fail-fastвикликає виняток відразу як виявить, що структура колекції була змінена після початку перебору. Під зміною структури ми розуміємо додавання/видалення/зміну елемента колекції, тоді як інший потік перебирає колекцію.

  6. Яка різниця між fail-fastі fail-safe?

    На противагу fail-fast, ітератори fail-safeне викликають жодних винятків при зміні структури, тому що вони працюють із клоном колекції замість оригіналу.

    Ітератор колекції CopyOnWriteArrayListта ітератор представлення keySetколекції ConcurrentHashMapє прикладами ітераторів fail-safe.

  7. Як уникнути ConcurrentModificationExceptionпід час перебору колекції?

    Насамперед, можна підібрати інший ітератор, який працює за принципом fail-safe. Наприклад, якщо ви використовуєте List, можете взяти ListIterator. Якщо вам потрібна застаріла колекція — то використовуйте перелічувачі.

    У тому випадку, коли вищевикладене вам не підходить, у вас є три варіанти:

    • При використанні JDK 1.5 або вище, вам підійдуть класи ConcurrentHashMapта CopyOnWriteArrayList. Це найкращий варіант
    • Ви можете перетворити список на масив і перебирати масив
    • Ви можете блокувати зміни списку на час перебору за допомогою блокуsynchronized

    Зверніть увагу, що останні два варіанти негативно позначаться на продуктивності.

  8. Що таке UnsupportedOperationException?

    Цей виняток виникає під час виклику методу, який не підтримується цією колекцією. Наприклад, якщо ви створите список тільки для читання за допомогою Collections.unmodifiableList(list), а потім у нього викличете метод add()або remove()ви точно отримаєте цей виняток.

  9. Які класи колекцій дозволяють отримати доступ до будь-якого елемента?

    Класи ArrayList, HashMap, TreeMap, Hashtableдозволяють доступ до будь-якого елемента.

  10. Що таке BlockingQueue?

    Це черга, яка дозволяє обробляти ситуації, коли з порожньої черги намагаються отримати елемент, або коли намагаються додати елемент до черги, а місце у ній закінчилося. Методи блокуючої черги можуть бути чотирьох типів: Перші викликають виняток, другі повертають спеціальні значення ( nullабо false, залежно від операції), треті блокують поточний потік доти, поки операція не може бути виконана, і четверті блокують потік тільки на певний проміжок часу.

    Приклади можна переглянути в цій статті .

  11. Що таке черга та стек, перерахуйте різницю між ними?

    Колекції, створені для того, щоб зберігати елементи для подальшої обробки. Крім базових операцій інтерфейсу Collection, черги підтримують додаткові операції додавання, видалення та перевірки стану елемента. Зазвичай, але не обов'язково черги працюють за принципом FIFO – першим прийшов, першим пішов. Стек майже як черга, але працює за принципом LIFO останнім прийшов, першим пішов.

    Незалежно від порядку додавання/видалення, голова черги – це елемент, який буде видалений під час виклику методів remove()або poll(). Також зверніть увагу на те, що Stackобидва Vectorпотокобезпечні.

    Використання: Використовуйте чергу, якщо ви хочете обробляти потік елементів в тому ж порядку, в якому вони надходять. Добре для списку завдань та обробки запитів. Використовуйте стек якщо ви хочете класти та видаляти елементи тільки з вершини стеку, що корисно у рекурсивних алгоритмах.

    (А тепер відвернемося і пояснимо все трохи інакше. Отже, уявіть обойму автомата. Ви вставляєте туди патрони по одному, тільки з одного кінця. І з цього ж кінця, по одному їх забиратиме механізм при стрільбі. Це — стек, покласти елемент можна тільки на його вершину, зняти звідти ж і більше нізвідки, останній елемент буде знятий першим.

    Черга - як трубка, в яку ви можете закочувати кульки, і з іншого кінця їх забирати. Черга дозволяє класти елементи лише у свій хвіст, а забирати лише з голови. Той елемент який був першим покладений, першим буде і забраний.

    Загальне у черзі і стека тільки те, що у них обох є фіксоване місце, куди можна покласти елемент, і фіксоване місце, звідки його можна забрати - всі інші елементи недоступні.(Прим. пров.))

  12. Що таке інтерфейси Comparableта Comparator?

    У Java, всі колекції, що підтримують автоматичне сортування, використовують методи порівняння для того, щоб правильно розсортувати елементи. Як приклад таких класів ми можемо вказати TreeSetі TreeMapт.д. Щоб розсортувати елементи, клас повинен реалізувати інтерфейси Comparatorабо Comparable. Саме тому класи-обертки як Integer, Doubleі Stringреалізують інтерфейс Comparable. Інтерфейс Comparableдопомагає зберігати природне сортування, тоді як Comparatorдозволяє сортувати елементи за різними спеціальними шаблонами. Примірник компаратора зазвичай передається конструктору колекції, якщо це підтримує.

    (Знову пояснюю інакше. Інтерфейс Comparatorописує метод int compare(T o1, T o2), тобто об'єкт реалізує цей інтерфейс може бути використаний для порівняння двох інших об'єктів одного класу. Якщо даний метод поверне 0 - об'єкти рівні, +1 і -1 говорять про те, що перший об'єкт "більше" другий або навпаки Який сенс ви вкладете в поняття "більше" і "менше" стосовно ваших об'єктів - виключно ваша справа - ви описуєте клас, що реалізує інтерфейсСomparator, і в цьому методі визначаєте, як ви хочете порівнювати ваші об'єкти. Потім передаєте об'єкт цього класу конструктору колекції, в якій зберігаються об'єкти, що порівнюються даним методом, і колекція зможе їх сортувати за зростанням/зменшенням. Повторюю - у вас є колекція в якій зберігаються об'єкти класу T, і є ще один об'єкт, іншого класу, що реалізує інтерфейс Comparator, вся суть якого в тому, що він вміє порівнювати ці об'єкти класу T, більше він ні для чого не потрібен.

    Інтерфейс Comparableописує метод int compareTo(T o), тобто викликається не для порівняння двох інших об'єктів, а порівняння себе самого з кимось ще. Тобто вам не потрібен окремий об'єкт-порівняльник, ви закладаєте механізм порівняння в сам елемент, що зберігається в колекції. Що й у якій ситуації зручніше – вирішувати вам.(Прим. пров.))

  13. Що таке класи Collectionsта Arrays?

    Класи Collectionsі Arraysце спеціальні службові класи для роботи з класами-колекціями. Вони дозволяють перетворювати колекції, робити їх захищеними від запису або потокобезпечними, сортувати їх у різний спосіб тощо.

  14. Список використаної літератури

    Ну це не питання для співбесіди. Чисто за приколом. (Але для досягнення нірвани ви повинні читати якомога більше статей, ваше волосся стане шовковистим і кучерявим і карма очиститься.(Прим. пров.))

Сподіваюся ці питання допоможуть вам на наступній співбесіді. Надалі, я раджу вам почитати щось додатково. Чим більше ви знаєте, тим краще! Хорошого навчання! Оригінал статті
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ