- Назвіть різницю між
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
іHashTable
Java: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
іList
Map . На відміну від ньогоListIterator
може бути використаний тільки для перебору елементів колекції.List
Iterator
дозволяє перебирати елементи лише одному напрямку, з допомогою методу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
це спеціальні службові класи для роботи з класами-колекціями. Вони дозволяють перетворювати колекції, робити їх захищеними від запису або потокобезпечними, сортувати їх у різний спосіб тощо. - Список використаної літератури
Ну це не питання для співбесіди. Чисто за приколом. (Але для досягнення нірвани ви повинні читати якомога більше статей, ваше волосся стане шовковистим і кучерявим і карма очиститься.(Прим. пров.))
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ