Питання про відмінності різних колекцій
- Назвіть різницю між
SetіList? - Назвіть різницю між
ListіMap? - Назвіть різницю між
HashMapіHashTable? - Назвіть різницю між
VectorіArrayList? - Назвіть різницю між
IteratorіEnumeration? - Назвіть різницю між
HashMapіHashSet? - Назвіть різницю між
IteratorіListIterator? - Назвіть різницю між
TreeSetіSortedSet? - Назвіть різницю між
ArrayListіLinkedList?
- Як зробити колекцію лише для читання?
- Як зробити потокобезпечну колекцію?
- Чому не існує методу
Iterator.add()додавання елементів до колекції? - Які є способи перебирати елементи списку?
- Як ви розумієте роботу якості ітератора
fail-fast? - Яка різниця між
fail-fastіfail-safe? - Як уникнути
ConcurrentModificationExceptionпід час перебору колекції? - Що таке
UnsupportedOperationException? - Які класи колекцій дають доступ до будь-якого елемента?
- Що таке
BlockingQueue? - Що таке черга та стек, перерахуйте різницю між ними?
- Що таке інтерфейси
ComparableтаComparator? - Що таке класи
CollectionsтаArrays? - Список використаної літератури
Питання про відмінності різних колекцій
-
Назвіть різницю між
SetіList?Список ключових відмінностей:
Безліч - неупорядковані колекції, тоді як списки - впорядковані, де кожен елемент має індекс, що починається з нуля. Списки можуть містити два і більше однакові елементи, а безліч не можуть. У списку може міститися скільки завгодно елементівnull, у безлічі лише один. -
Назвіть різницю між
ListіMap?Найлегше питання. Список це колекція елементів, а словник це колекція пар ключ/значення. Є ще безліч змін, але всі вони є наслідком цього. Вони мають різний інтерфейс верхнього рівня, різний набір методів і різні представлення даних. У більшості випадків достатньо лише першої відповіді.
-
Назвіть різницю між
HashMapіHashTable?Є кілька відмінностей між
HashMapіHashTableJava:HashTableпотокобезпечна, аHashMapніHashTableне може містити елементиnull, тоді якHashMapможе містити один ключnullі будь-яку кількість значеньnull- Третя ключова відмінність між ними — ітератор
HashMap, на відміну від перелічувачаHashTable, працює за принципомfail-fast(видає виняток за будь-якої неузгодженості даних)
-
Назвіть різницю між
VectorіArrayList?Зазначимо деякі відмінності:
- Усі методи
Vectorпотокобезпечні, а уArrayList- ні Vectorце застарілий клас доданий у першому релізі JDK.ArrayListз'явився в JDK 1.2, разом з іншими класами фреймворкуCollection- За замовчуванням
Vectorподвоює свій розмір, коли закінчується виділена під елементи пам'ять.ArrayListж збільшує свій розмір лише на половину
- Усі методи
-
Назвіть різницю між
IteratorіEnumeration?Ітератори відрізняються від перелічників за трьома ознаками:
- Існують ітератори, які дозволяють видаляти елементи зі своєї колекції під час перебору з використанням методу
remove(). КласIteratorданого функціоналу не підтримує. За допомогою перелічувача не можна додавати/вилучати елементи - Перелічувачі присутні у застарілих класах, таких як
Vector/Stack, тоді як ітератори є у всіх сучасних класах-колекціях - Ще невелика відмінність у цьому, що з ітераторів і перелічувачів відрізняється найменування способів, тобто
Enumeration.hasMoreElements()відповідаєIterator.hasNext()іEnumeration.nextElement()відповідаєIterator.next()і т.д.
- Існують ітератори, які дозволяють видаляти елементи зі своєї колекції під час перебору з використанням методу
-
Назвіть різницю між
HashMapіHashSet?HashMap— колекція пар ключ/значення, тоді якHashSetупорядкована колекція унікальних елементів. І це все, не потрібно більше жодних пояснень. -
Назвіть різницю між
IteratorіListIterator?Є три відмінності:
Iteratorможе використовуватися для перебору елементівSetіListMap . На відміну від ньогоListIteratorможе бути використаний тільки для перебору елементів колекції.ListIteratorдозволяє перебирати елементи лише одному напрямку, з допомогою методуnext(). Тоді якListIteratorдозволяє перебирати список в обох напрямках, за допомогою методівnext()іprevious()- За допомогою
ListIteratorви можете модифікувати список, додаючи/видаляючи елементи за допомогою методівadd()таremove().Iteratorне підтримує цього функціоналу
-
Назвіть різницю між TreeSet і SortedSet?
SortedSetце інтерфейс, що реалізується класомTreeSet. От і все! - Назвіть різницю між
ArrayListіLinkedList?LinkedListзберігає елементи у двозв'язному списку, тоді якArrayListзберігає їх у масиві, розмір якого може динамічно змінюватисяLinkedListпідтримує додавання/видалення елементів за фіксований час, але лише послідовний доступ до елементів. Тобто ви можете перебрати список з початку в кінець і з кінця в початок, але отримання елемента в середині списку займе час пропорційне розміру списку.ArrayListА дозволяє отримати будь-який елемент за його індексом за фіксований час. Але додавання/видалення елементів туди вимагає витрат часу пропорційних розміру, тому що потрібно посунути всі елементи з місця вставки/видалення і до кінця списку, або щоб звільнити місце для вставляння або щоб прибрати пропуск на місці віддаленогоLinkedListвимагає більше пам'яті для зберігання такої ж кількості елементів, тому що крім самого елемента зберігаються ще покажчики на наступний та попередній елементи списку, тоді як елементиArrayListпросто йдуть по порядку
І ще питання
-
Як зробити колекцію лише для читання?
Використовуйте такі методи:
Collections.unmodifiableList(list);Collections.unmodifiableSet(set);Collections.unmodifiableMap(map);
Всі вони приймають колекцію як параметр і повертають колекцію тільки для читання з тими ж елементами всередині.
-
Як зробити потокобезпечну колекцію?
Використовуйте такі методи:
Collections.synchronizedList(list);Collections.synchronizedSet(set);Collections.synchronizedMap(map);
Усі вони приймають колекцію як параметр, і повертають потокобезопасную колекцію з тими самими елементами всередині.
-
Чому не існує методу
Iterator.add()додавання елементів до колекції?Єдине завдання ітератора – це перебір колекції. Кожна колекція має метод
add(), яким ви можете скористатися. Немає сенсу додавати цей метод до ітератора, тому що колекції можуть бути впорядкованими та невпорядкованими, і методadd()при цьому має бути влаштований по-різному. -
Які є способи перебирати елементи списку?
Є 4 способи:
- Цикл із ітератором
- Цикл
for - Розширений цикл for
- Цикл
while
-
Як ви розумієте роботу якості ітератора
fail-fast?Ітератор
fail-fastвикликає виняток відразу як виявить, що структура колекції була змінена після початку перебору. Під зміною структури ми розуміємо додавання/видалення/зміну елемента колекції, тоді як інший потік перебирає колекцію. -
Яка різниця між
fail-fastіfail-safe?На противагу
fail-fast, ітераториfail-safeне викликають жодних винятків при зміні структури, тому що вони працюють із клоном колекції замість оригіналу.Ітератор колекції
CopyOnWriteArrayListта ітератор представленняkeySetколекціїConcurrentHashMapє прикладами ітераторівfail-safe. -
Як уникнути
ConcurrentModificationExceptionпід час перебору колекції?Насамперед, можна підібрати інший ітератор, який працює за принципом
fail-safe. Наприклад, якщо ви використовуєтеList, можете взятиListIterator. Якщо вам потрібна застаріла колекція — то використовуйте перелічувачі.У тому випадку, коли вищевикладене вам не підходить, у вас є три варіанти:
- При використанні JDK 1.5 або вище, вам підійдуть класи
ConcurrentHashMapтаCopyOnWriteArrayList. Це найкращий варіант - Ви можете перетворити список на масив і перебирати масив
- Ви можете блокувати зміни списку на час перебору за допомогою блоку
synchronized
Зверніть увагу, що останні два варіанти негативно позначаться на продуктивності.
- При використанні JDK 1.5 або вище, вам підійдуть класи
-
Що таке
UnsupportedOperationException?Цей виняток виникає під час виклику методу, який не підтримується цією колекцією. Наприклад, якщо ви створите список тільки для читання за допомогою
Collections.unmodifiableList(list), а потім у нього викличете методadd()абоremove()ви точно отримаєте цей виняток. -
Які класи колекцій дозволяють отримати доступ до будь-якого елемента?
Класи
ArrayList,HashMap,TreeMap,Hashtableдозволяють доступ до будь-якого елемента. -
Що таке
BlockingQueue?Це черга, яка дозволяє обробляти ситуації, коли з порожньої черги намагаються отримати елемент, або коли намагаються додати елемент до черги, а місце у ній закінчилося. Методи блокуючої черги можуть бути чотирьох типів: Перші викликають виняток, другі повертають спеціальні значення (
nullабоfalse, залежно від операції), треті блокують поточний потік доти, поки операція не може бути виконана, і четверті блокують потік тільки на певний проміжок часу.Приклади можна переглянути в цій статті .
-
Що таке черга та стек, перерахуйте різницю між ними?
Колекції, створені для того, щоб зберігати елементи для подальшої обробки. Крім базових операцій інтерфейсу
Незалежно від порядку додавання/видалення, голова черги – це елемент, який буде видалений під час виклику методівCollection, черги підтримують додаткові операції додавання, видалення та перевірки стану елемента. Зазвичай, але не обов'язково черги працюють за принципом FIFO – першим прийшов, першим пішов. Стек майже як черга, але працює за принципом LIFO останнім прийшов, першим пішов.remove()абоpoll(). Також зверніть увагу на те, щоStackобидваVectorпотокобезпечні.Використання: Використовуйте чергу, якщо ви хочете обробляти потік елементів в тому ж порядку, в якому вони надходять. Добре для списку завдань та обробки запитів. Використовуйте стек якщо ви хочете класти та видаляти елементи тільки з вершини стеку, що корисно у рекурсивних алгоритмах.
(А тепер відвернемося і пояснимо все трохи інакше. Отже, уявіть обойму автомата. Ви вставляєте туди патрони по одному, тільки з одного кінця. І з цього ж кінця, по одному їх забиратиме механізм при стрільбі. Це — стек, покласти елемент можна тільки на його вершину, зняти звідти ж і більше нізвідки, останній елемент буде знятий першим.
Черга - як трубка, в яку ви можете закочувати кульки, і з іншого кінця їх забирати. Черга дозволяє класти елементи лише у свій хвіст, а забирати лише з голови. Той елемент який був першим покладений, першим буде і забраний.
Загальне у черзі і стека тільки те, що у них обох є фіксоване місце, куди можна покласти елемент, і фіксоване місце, звідки його можна забрати - всі інші елементи недоступні.(Прим. пров.))
-
Що таке інтерфейси
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), тобто викликається не для порівняння двох інших об'єктів, а порівняння себе самого з кимось ще. Тобто вам не потрібен окремий об'єкт-порівняльник, ви закладаєте механізм порівняння в сам елемент, що зберігається в колекції. Що й у якій ситуації зручніше – вирішувати вам.(Прим. пров.)) - Що таке класи
CollectionsтаArrays?Класи
CollectionsіArraysце спеціальні службові класи для роботи з класами-колекціями. Вони дозволяють перетворювати колекції, робити їх захищеними від запису або потокобезпечними, сортувати їх у різний спосіб тощо. - Список використаної літератури
Ну це не питання для співбесіди. Чисто за приколом. (Але для досягнення нірвани ви повинні читати якомога більше статей, ваше волосся стане шовковистим і кучерявим і карма очиститься.(Прим. пров.))
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ