Деякі з тверджень тут заплутані або навіть неправильні, особливо думка про те, що непорушний. Вектор у Scala - це щось на зразок ArrayList. Список і вектор є незмінними, стійкими (тобто "дешевими для отримання зміненої копії") даних. Немає розумного вибору за замовчуванням, оскільки це може бути для змінних структур даних, але це, скоріше, залежить від того, що робить ваш алгоритм. Список - це окремо пов'язаний список, тоді як вектор - це ціле число трие базової 32, тобто це своєрідне дерево пошуку з вузлами ступеня 32. Використовуючи цю структуру, Вектор може надавати найбільш поширені операції досить швидко, тобто в O (log_32 ( п)). Це працює для додавання, додавання, оновлення, випадкового доступу, розкладання в голові / хвості. Ітерація в послідовному порядку лінійна. Список, з іншого боку, просто забезпечує лінійну ітерацію та постійне збільшення часу, розкладання в голові / хвості.
Це може виглядати так, як ніби Вектор майже є гарною заміною списку майже у всіх випадках, але препендація, розкладання та ітерація часто є найважливішими операціями над послідовностями у функціональній програмі, а константи цих операцій (набагато) вищі за вектор до її більш складної структури. Я зробив кілька вимірювань, тому ітерація приблизно вдвічі швидша для списку, препендація приблизно 100 разів швидша за списками, розкладання в голові / хвості приблизно в 10 разів швидше за списками, а генерація з траверсу - приблизно в 2 рази швидше для векторів. (Це, мабуть, тому, що вектор може виділяти масиви з 32 елементів одночасно, коли ви збираєте його за допомогою конструктора замість того, щоб попередньо додавати або додавати елементи по черзі).
Отже, яку структуру даних ми повинні використовувати? В основному, є чотири поширені випадки:
- Нам потрібно лише трансформувати послідовності за допомогою таких операцій, як map, filter, fold і т. Д .: в основному це не має значення, ми повинні програмувати наш алгоритм загально і навіть може отримати користь від прийняття паралельних послідовностей. Для послідовних операцій Список, мабуть, трохи швидший. Але вам слід орієнтувати його, якщо вам доведеться оптимізувати.
- Нам потрібно багато випадкового доступу та різних оновлень, тому ми повинні використовувати векторні, список буде надмірно повільним.
- Ми працюємо над списками класичним функціональним способом, будуючи їх заздалегідь, повторюючи та повторюючи шляхом рекурсивного розкладання: список використання, вектор буде повільнішим на коефіцієнт 10-100 і більше.
- У нас є критичний алгоритм продуктивності, який в основному є необхідним і робить багато випадкового доступу до списку, щось подібне на місце швидкого сортування: використовуйте імперативну структуру даних, наприклад, ArrayBuffer, локально та скопіюйте свої дані з і до нього.
List<String> l = new ArrayList<String>()
блоги Scala, якщо ти вважаєш, що всі користуються списком, щоб отримати стійку корисність для колекції - але чи достатньо загального призначення "Вектора", що ми повинні використовувати його на місці списку?