Колекції можуть бути реалізовані різними способами і немає єдиного - правильного. При одному підході одні операції є швидкими, а інші повільними, при іншому - все навпаки. Тому було вирішено зробити кілька реалізацій однієї і тієї ж колекції. І кожна реалізація була оптимізована для якогось вузького набору операцій. Так з'явилися різні колекції.
Розглянемо це на прикладі двох класів - ArrayList і LinkedList.
ArrayList реалізований всередині у вигляді звичайного масиву. Тому при вставці елементу в середину, доводитися спочатку зсувати на один всі елементи після нього, а вже потім в місце, що звільнилося вставляти новий елемент. Зате в ньому швидко реалізовані взяття і зміна елемента - операції get, set, так як в них ми просто звертаємося до відповідного елементу масиву.
LinkedList реалізований всередині по-іншому. Він реалізований у вигляді зв'язного списку: набору окремих елементів, кожен з яких зберігає посилання на наступний і попередній елементи. Щоб вставити елемент в середину такого списку, досить поміняти посилання його майбутніх сусідів. А от щоб отримати елемент з номером 130, потрібно пройтися послідовно по всіх об'єктах від 0 до 130. Іншими словами операції set і get тут реалізовані дуже повільно.
Опис
|
Операція
|
ArrayList
|
LinkedList
|
взяття елемента
|
get
|
швидко
|
повільно
|
Присвоєння елементу
|
set
|
швидко
|
повільно
|
Додавання елемента
|
add
|
швидко
|
швидко
|
вставка елемента
|
add
(i, value)
|
повільно
|
швидко
|
видалення елемента
|
remove
|
повільно
|
швидко
|
Якщо треба вставляти (або видаляти) всередину колекції багато елементів, то краще використовувати LinkedList. У всіх інших випадках - ArrayList.