
Запитання у цій статті:
Загальні питання- Що таке колекції Java? Перерахуйте їх переваги
- Розкажіть про ієрархію колекцій
- Чому колекції не успадковують інтерфейси
Cloneable
таSerializable
? - Чому інтерфейс
Map
не успадковує інтерфейсCollection
?
- Чому ми використовуємо списки? Які основні класи реалізують інтерфейс
List
? - Як перетворити масив рядків на
ArrayList
? - Як відсортувати список у зворотному порядку?
- Чому ми використовуємо безліч? Які основні класи реалізують інтерфейс
Set
? - Як зберігаються елементи в
HashSet
? - Чи може бути елемент
null
доданий вTreeSet
абоHashSet
?
- Чому ми використовуємо словники? Які основні класи реалізують інтерфейс
Map
? - Що таке
IdentityHashMap
іWeakHashMap
? - Поясніть що таке
ConcurrentHashMap
? Як воно працює? - Як працюють словники?
- Як створити добрий ключ для словника?
- Які уявлення вмісту надає інтерфейс
Map
? - Коли потрібно використовувати
HashMap
, а колиTreeMap
?
- Назвіть різницю між
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
? - Список використаної літератури
Загальні питання
-
Що таке колекції Java? Перерахуйте їхні переваги?
За визначенням — колекція це об'єкт, що є групою об'єктів. Як у теорії множин - безліч це група об'єктів. Просто, чи не так? До виходу JDK 1.2, існували такі класи як
Vector
іHashTable
, але не було фреймворкуCollection
. Потім було вирішено додати підтримку структур даних, що багаторазово використовуються. Цей фреймворк був розроблений переважно Джошуа Блохом, і вперше з'явився у JDK 1.2.Як головні переваги ми можемо перерахувати:
- Зменшуються витрати часу на написання коду
- Покращується продуктивність завдяки використанню високоефективних алгоритмів і структур даних
- Колекції є універсальним способом зберігання та передачі даних, що спрощує взаємодію різних частин коду.
- Простота у вивченні, тому що необхідно вивчити тільки найвищі інтерфейси та підтримувані операції
-
Розкажіть про ієрархію колекцій?
Як показано на зображенні, фреймворк колекцій містить один інтерфейс верхнього рівня -
Collection
, від якого успадковуютьсяSet
,List
іQueue
. Нижче ми розглянемо ще безліч класів, які у цих трьох гілках. Запам'ятайте заголовок інтерфейсуCollection
, це допоможе вам з багатьма питаннями.public interface Collection extends Iterable { //описание методов }
Також фреймворк містить інтерфейс 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
надає статичні методи операцій над масивами.String[] words = {"аз", "буки", "веди", "глагол", "добро"}; //Как вы можете обратить внимание, у нас есть массив строк String[] words. //В котором у нас лежат 5 строк. List wordList = Arrays.asList(words); //легким движением руки, а точнее вызовом Arrays.asList() мы превратабо наш //массив строк в список List wordList.
Також хотілося б відзначити, що цей метод здатний обробляти не лише рядки, він створить список елементів будь-якого типу, якого був масив.
Integer[] nums = {1, 2, 3, 4}; List numList = Arrays.asList(nums);
-
Як відсортувати список у зворотному порядку?
Як і попереднє, це питання перевіряє ваше знання службових класів
Collection
List reversedList = Collections.reverse(list);
Питання про безліч
-
Чому ми використовуємо безліч? Які основні класи реалізують інтерфейс
Set
?Він моделює математичну множину, з теорії множин. Інтерфейс
Set
схожий наList
, але має деякі відмінності. Перше – це не впорядкована колекція. Отже, додавання/видалення елементів не потребує їх сортування. Головна особливість множин - унікальність елементів, тобто один і той самий елемент не може утримуватися в множині двічі.Дуже важливими для функціонування множин є методи
equals()
іhashCode()
вони дозволяють порівнювати безлічі різних класів. Дві множини є ідентичними тільки якщо вони містять одні й ті самі елементи.Як випливає з вищевикладеного, множини не підтримують операцій заснованих на індексі елемента, як списки. Багато мають тільки ті методи, які описані в інтерфейсі.
Collection
Основними класами, що реалізують інтерфейс
Set
, єEnumSet
,HashSet
,LinkedHashSet
іTreeSet
. Якщо хочете дізнатися більше, почитайте відповідні розділи документації Java. -
Як зберігаються елементи в
HashSet
?Як ви вже в курсі,
HashMap
зберігає пари ключ/значення, і ключі мають бути унікальними.HashSet
використовує цю особливістьHashMap
задля забезпечення унікальності своїх елементів. У класіHashSet
словник описаний наступним чином:private transient HashMap<E, Object> map; private static final Object PRESENT = new Object();
Отже, коли ви зберігаєте елемент у множині, воно кладе даний елемент як ключ у словник, а значенням йде об'єкт PRESENT, як описано нижче:
public boolean add(E e) { return map.put(e, PRESENT) == null; }
Я настійно рекомендую вам прочитати цю статтю , це допоможе вам з легкістю відповісти на всі
HashMap
питання. -
Чи може бути елемент
null
доданий вTreeSet
абоHashSet
?Як очевидно з попередньої відповіді, методі
add()
немає перевірки наnull
. ТакожHashMap
дозволяє один ключnull
, отже, один елементnull
може бути доданий вHashSet
.TreeSet
працює за тим же принципом, що іHashSet
, але використовуєNavigableMap
для зберігання елементівprivate transient NavigableMap<E,Object> m; private static final Object PRESENT = new Object();
NavigableMap
це клас-спадкоємецьSortedMap
, аSortedMap
не дозволяє використання ключівnull
. Отже,TreeMap
не підтримує зберігання елементів типуnull
. Якщо ви спробуєте додатиnull в TreeSet
, отримайте винятокNullPointerException
.
Запитання про словники
-
Чому ми використовуємо словники (
Map
)? Які основні класи реалізують інтерфейсMap
?Словники – спеціальний тип колекції, яка використовується для зберігання пар ключ/значення. З цієї причини він не є спадкоємцем інтерфейсу
Collection
. Словник надає методи для додавання пар ключ/значення, видалення, пошуку та перебору за уявленням даних, що надаються словником.Основні класи реалізують інтерфейс
Map
:HashMap
,Hashtable
,EnumMap
,IdentityHashMap
,LinkedHashMap
іProperties
. -
Що таке
IdentityHashMap
іWeakHashMap
?IdentityHashMap
схожий заHashMap
одним винятком — для порівняння об'єктів використовується порівняння покажчиків на об'єкти, якщо покажчики не рівні (вказують на об'єкти, що лежать за різними адресаами), отже, об'єкти вважаються різними.IdentityHashMap
є досить рідко використовується. Хоча він реалізує інтерфейсMap
, він порушує один з основних принципів пристроюMap
, який вимагає використання методуequals()
для порівняння об'єктів.IdentityHashMap
використовується тільки в тих випадках, коли потрібно порівняти об'єкти за їх адресаами.WeakHashMap
це реалізація інтерфейсуMap
, що містить слабкі посилання елементи. Тобто, якщо за межамиWeakHashMap
не залишилося жодного посилання на його елемент, цей елемент видаляється збирачем сміття. Клас призначений для використання з об'єктами, у яких методequals()
перевіряє ідентичність об'єктів за допомогою оператора==
. Після того як елемент буде видалений збирачем сміття, він вже не може бути відновлений, і на превеликий подив програміста знайти його у словнику більше не вийде. -
Поясніть що таке
ConcurrentHashMap
? Як воно працює?Взято з офіційної документації:
Реалізація словника повністю підтримує багатопотокове додавання/видалення/пошук елементів. Цей клас слід тим самим специфікаціям як іHashtable
, і містить методи відповідні методамHashtable
. Однак, хоча всі операції є потокобезпечними, операція з вибірки елементів не блокує таблицю, і взагалі немає можливості заборонити доступ до таблиці. Цей клас сумісний зHashtable
усім крім питань багатопоточної синхронізації. -
Як працює
hashmap
?Найважливіше питання, яке швидше за все буде поставлене на співбесіді програмісту будь-якого рівня. Ви повинні добре розбиратися в цій темі, і не тільки тому що це питання, що найбільше задається, але і тому що розуміння пристрою
hashmap
дозволяє вам легше розібратися в інших особливостях роботи колекцій.Відповідь на це питання дуже велика, і повністю її можна прочитати в цій статті - як працює hashmap . А зараз просто запам'ятайте що
HashMap
працює на основі хешування. Словник, за визначенням, це об'єкт, який пов'язує ключі та значення. Для зберігання таких структур він використовує внутрішній класEntry
.static class Entry implements Map.Entry { final K key; V value; Entry next; final int hash; ...//Еще много кода тут }
Змінні
key
таvalue
служать для зберігання ключа та значення. А самі об'єктиEntry
лежать у масиві./** * Размер таблицы меняется по необходимости, * и обязательно должен быть дорівнює степени двойки */ transient Entry[] table;
Індекс потрібного елемента в масиві обчислюється за хеш-кодом ключа. Більше інформації можна отримати за посиланням на початку відповіді.
-
Як створити добрий ключ для словника?
Наступне гарне питання, яке зазвичай ставлять слідом за питанням про функціонування
HashMap
. Отже, головне обмеження — ключ має бути таким, щоб потім ним можна було отримати зі словника значення. Інакше у його використанні просто немає сенсу. Якщо ви розумієте як функціонуєhashmap
, ви знаєте, що його робота сильно залежить від методівhashCode()
іequals()
об'єктів-ключів.Як випливає з вищевикладеного, хороший ключ повинен давати той самий
hashCode
знову і знову, незалежно від того скільки разів він запитується. Також, однакові ключі, при виклику методуequals()
повинні повертати true, а різні — false.З чого випливає, що найкращими кандидатами на роль ключа є незмінні класи.
Можете почитати ще за адресаою .
-
Які уявлення вмісту надає інтерфейс
Map
?Інтерфейс
Map
надає три уявлення збережених даних:- безліч усіх ключів
- безліч усіх значень
- безліч об'єктів
Entry
, що містять у собі і ключ і значення
Переміщатися ними можна за допомогою ітераторів.
-
Коли потрібно використовувати
HashMap
, а колиTreeMap
?HashMap
це дуже широко використовуваний клас, і ви знаєте. Отже, я обмежуся тим, що скажу, що в ньому зберігаються пари ключ/значення і він дозволяє проводити над ними багато операцій.TreeMap
це особливий різновидHashMap
. Різниця в тому, що ключі зберігаютьсяTreeMap
впорядковано. За умовчанням застосовується "природне сортування". Перевизначити сортування можна надавши екземпляр класуComparator
, методcompare
якого буде використаний для сортування ключів.Зверніть увагу, що всі ключі, додані до словника, повинні реалізовувати інтерфейс
Comparable
(це необхідно для сортування). Більше того, всі ключі повинні бути взаємно сумісними:k1.compareTo(k2)
не повинен викликатиClassCastException
для тих,k1
хтоk2
зберігається у словнику. Якщо користувач спробує покласти в словник ключ, який порушує цю умову (наприклад, рядковий ключ у словник, де всі ключі типуInteger
), методput(Object key, Object value)
повинен викликатиClassCastException
.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ