Які відмінності між двома структурами даних ArrayList та Vector , і де слід використовувати кожну з них?
Vector v = new Vector(3, 2);
Які відмінності між двома структурами даних ArrayList та Vector , і де слід використовувати кожну з них?
Vector v = new Vector(3, 2);
Відповіді:
Відмінності
Використовуйте ArrayLists, якщо немає певної вимоги використовувати Vectors.
Синхронізація
Якщо декілька потоків отримують доступ до ArrayList одночасно, ми повинні зовнішньо синхронізувати блок коду, який модифікує список структурно або просто змінює елемент. Структурна модифікація означає додавання або видалення елементів (-ів) зі списку. Встановлення значення існуючого елемента не є структурною модифікацією.
Collections.synchronizedList
зазвичай використовується під час створення списку, щоб уникнути випадкового несинхронізованого доступу до списку.
Зростання даних
Внутрішньо ArrayList і Vector утримують свій вміст за допомогою масиву. Коли елемент вставляється в ArrayList або Vector, об’єкт повинен буде розширити свій внутрішній масив, якщо у нього не вистачає місця. Значення за замовчуванням Vector збільшує подвоєння розміру його масиву, тоді як ArrayList збільшує розмір масиву на 50 відсотків.
Як йдеться в документації, a Vector
і an ArrayList
майже рівнозначні. Різниця полягає в тому, що доступ до а Vector
синхронізований, тоді як доступ до антителі ArrayList
немає. Це означає, що лише один потік може одночасно викликати методи Vector
, і в процесі придбання блокування є невеликі накладні витрати; якщо ви використовуєте ArrayList
, це не так. Як правило, ви хочете використовувати ArrayList
; в однонитковому корпусі - це кращий вибір, а в багатопотоковому корпусі ви отримуєте кращий контроль над блокуванням. Хочете дозволити одночасне читання? Чудово. Хочете виконати одну синхронізацію для партії з десяти записів? Теж добре. Це вимагає трохи більше турботи про ваш кінець, але це, ймовірно, те, що ви хочете. Також зауважте, що якщо у вас є ArrayList, ви можете використовуватиCollections.synchronizedList
функція створення синхронізованого списку, отримуючи таким чином еквівалент а Vector
.
Vector
це зламано клас, НЕ поточно, незважаючи на його «синхронізований» і тільки використовується студентами та іншими недосвідченими програмістами.
ArrayList
це реалізація списку переходів, яку використовують професіонали та досвідчені програмісти.
Професіонали, які хочуть реалізувати список безпеки, використовують a CopyOnWriteArrayList
.
Vector
був призначений , щоб бути поточно, але має недолік дизайну , що робить його * Не насправді багатопотокової, Це в основному застарілий клас. Чомусь університети тощо не чули про цю новину і все ще виступають за її використання.
ArrayList
новіше і на 20-30% швидше.
Якщо вам не потрібно щось чітко видно Vector
, скористайтесяArrayList
20-30% faster
?
Існує 2 основних відмінності між Vector і ArrayList.
Вектор синхронізується за замовчуванням, а ArrayList - ні. Примітка: ви можете зробити ArrayList також синхронізованим, передавши об’єкт arraylist методу Collections.synchronizedList (). Синхронізований засіб: його можна використовувати з декількома потоками з будь-яким побічним ефектом.
ArrayLists зростає на 50% від попереднього розміру, коли простору не вистачає для нового елемента, де як Vector зросте на 100% від попереднього розміру, коли немає місця для нового вхідного елемента.
Крім цього, існують деякі практичні відмінності між ними, що стосуються зусиль програмування:
Коли використовувати який?
Примітка . Навіть незважаючи на те, що масив arraylist зростає на 100%, ви можете уникнути цього методом securecapacity (), щоб переконатися, що на початкових етапах ви виділяєте достатню кількість пам'яті.
Сподіваюся, це допомагає.
ArrayList
і Vector
обидва реалізує інтерфейс списку та підтримує порядок вставки. Але є багато відмінностей між класами ArrayList
та Vector
класами ...
ArrayList
не синхронізовано.ArrayList
з кроком 50% від поточного розміру масиву, якщо кількість елемента перевищує його ємність.ArrayList
не є спадковим класом, він введений у JDK 1.2.ArrayList
швидко, тому що він не синхронізований.ArrayList
використовує інтерфейс Iterator для переміщення елементів.Вектор -
Vector
синхронізовано.Vector
з кроком 100% означає подвоєння розміру масиву, якщо загальна кількість елемента перевищує його ємність.Vector
це клас спадщини.
Vector
є повільним, оскільки він синхронізований, тобто в багатопотоковому середовищі, він буде утримувати інші потоки в стані, що можна виконувати або не запускати, поки поточна нитка не звільнить замок об'єкта.
Vector
використовує інтерфейс перерахування для переходу елементів. Але він також може використовувати Iterator.
Дивіться також: https://www.javatpoint.com/difference-between-arraylist-and-vector
В основному обидва ArrayList і Vector використовують внутрішній масив Object.
ArrayList: Клас ArrayList розширює AbstractList та реалізує інтерфейс списку та RandomAccess (інтерфейс маркера). ArrayList підтримує динамічні масиви, які можуть зростати за потребою. Це дає нам першу ітерацію над елементами. ArrayList використовує внутрішній масив Object; вони створюються з початковим розміром за замовчуванням 10. Коли цей розмір буде перевищено, колекція автоматично збільшується до половини типового розміру, який становить 15.
Вектор: Вектор схожий на ArrayList, але відмінності полягають у тому, що він синхронізований і його початковий розмір за замовчуванням становить 10, а коли розмір перевищує його розмір збільшується до подвоєного початкового розміру, тобто новий розмір буде 20. Вектор - єдиний клас крім ArrayList для реалізації RandomAccess. Вектор має чотири конструктори, з яких один приймає два параметри. Вектор (int початковаЗамісність, int потужністьПовищення) capacIncrement - це сума, на яку збільшується ємність, коли вектор переповнюється, тому він має більше контролю над коефіцієнтом навантаження.
Деякі інші відмінності: