Які відмінності між ArrayList та Vector?


352

Які відмінності між двома структурами даних ArrayList та Vector , і де слід використовувати кожну з них?


5
Я не бачу тут точного дубліката.
Джефф Етвуд

2
Ну, ви можете створювати вектори і в java - Vector v = new Vector(3, 2);
sgsi

Ніколи не використовуйте Vector, використання ArrayListабо LinkedListабоArrayDeque

Відповіді:


365

Відмінності

  • Вектори синхронізовані, ArrayLists - ні.
  • Методи росту даних

Використовуйте ArrayLists, якщо немає певної вимоги використовувати Vectors.

Синхронізація

Якщо декілька потоків отримують доступ до ArrayList одночасно, ми повинні зовнішньо синхронізувати блок коду, який модифікує список структурно або просто змінює елемент. Структурна модифікація означає додавання або видалення елементів (-ів) зі списку. Встановлення значення існуючого елемента не є структурною модифікацією.

Collections.synchronizedList зазвичай використовується під час створення списку, щоб уникнути випадкового несинхронізованого доступу до списку.

Довідково

Зростання даних

Внутрішньо ArrayList і Vector утримують свій вміст за допомогою масиву. Коли елемент вставляється в ArrayList або Vector, об’єкт повинен буде розширити свій внутрішній масив, якщо у нього не вистачає місця. Значення за замовчуванням Vector збільшує подвоєння розміру його масиву, тоді як ArrayList збільшує розмір масиву на 50 відсотків.

Довідково


7
@Rei Саме те, що він сказав: Кілька тем ( docs.oracle.com/javase/tutorial/essential/concurrency/… )
RecursiveExceptionException

А як щодо ЧИТАННЯ з ArrayList багатопоточним способом? Це безпечно для ниток?
Ксюні

@Xunie Читання з ArrayList або інших класів колекції ніколи не буде проблемою. Проблема виникає під час додавання або видалення чи зміни існуючих значень до ArrayList або колекції.
sainath reddy

85

Як йдеться в документації, a Vectorі an ArrayListмайже рівнозначні. Різниця полягає в тому, що доступ до а Vectorсинхронізований, тоді як доступ до антителі ArrayListнемає. Це означає, що лише один потік може одночасно викликати методи Vector, і в процесі придбання блокування є невеликі накладні витрати; якщо ви використовуєте ArrayList, це не так. Як правило, ви хочете використовувати ArrayList; в однонитковому корпусі - це кращий вибір, а в багатопотоковому корпусі ви отримуєте кращий контроль над блокуванням. Хочете дозволити одночасне читання? Чудово. Хочете виконати одну синхронізацію для партії з десяти записів? Теж добре. Це вимагає трохи більше турботи про ваш кінець, але це, ймовірно, те, що ви хочете. Також зауважте, що якщо у вас є ArrayList, ви можете використовуватиCollections.synchronizedListфункція створення синхронізованого списку, отримуючи таким чином еквівалент а Vector.


53

Vectorце зламано клас, НЕ поточно, незважаючи на його «синхронізований» і тільки використовується студентами та іншими недосвідченими програмістами.

ArrayList це реалізація списку переходів, яку використовують професіонали та досвідчені програмісти.

Професіонали, які хочуть реалізувати список безпеки, використовують a CopyOnWriteArrayList.


10
синхронізований, але не безпечний для потоків? що це означає? [Я початківець]
Дінешкумар

13
@Dineshkumar Vectorбув призначений , щоб бути поточно, але має недолік дизайну , що робить його * Не насправді багатопотокової, Це в основному застарілий клас. Чомусь університети тощо не чули про цю новину і все ще виступають за її використання.
богем


3
@Dineshkumar вибачте - це було не гарне посилання. ось остаточна відповідь . Словом, його синхронізація марна.
богем

7
Веселий факт: Стек Java1.7 використовує клас Vector.
Тобі

26

ArrayList новіше і на 20-30% швидше.

Якщо вам не потрібно щось чітко видно Vector, скористайтесяArrayList


32
Чи можете ви підтримати претензію, надавши докази 20-30% faster?
користувач

5
@user У той час це був лише особистий досвід, коли чіплявся навколо величезних масивів. Понад три роки я не можу вказати вам саме на те, про що я говорив, але там є безліч орієнтирів. Це не до нарізки, де ви бачите найбільші стрибки, але ось такий: javacodegeeks.com/2010/08/…
Олі

Лише 20-30% відповідають, якщо ви читаєте І пишете в Vector / Arraylist, оскільки функція росту зробить найбільший вплив. Якщо у вас є орієнтир, який пише лише один раз, а потім виконує лише читання, дасть інший результат
Tobi

2
Будь ласка, надайте докази до своїх даних
провідний знак

Оскільки вектор синхронізований і масив не синхронізований, це може бути причиною, арраїліст швидше, ніж вектор.
ASK

23

Існує 2 основних відмінності між Vector і ArrayList.

  1. Вектор синхронізується за замовчуванням, а ArrayList - ні. Примітка: ви можете зробити ArrayList також синхронізованим, передавши об’єкт arraylist методу Collections.synchronizedList (). Синхронізований засіб: його можна використовувати з декількома потоками з будь-яким побічним ефектом.

  2. ArrayLists зростає на 50% від попереднього розміру, коли простору не вистачає для нового елемента, де як Vector зросте на 100% від попереднього розміру, коли немає місця для нового вхідного елемента.

Крім цього, існують деякі практичні відмінності між ними, що стосуються зусиль програмування:

  1. Для отримання елемента в певному місці з Vector ми використовуємо функцію elementAt (int index). Назва цієї функції дуже тривала. Замість цього в ArrayList ми отримуємо (INT індекс) , який дуже легко запам'ятати і використовувати.
  2. Аналогічно для заміни існуючого елемента на новий елемент у Vector ми використовуємо метод setElementAt (), який знову дуже тривалий і може дратувати програміста багаторазово. Замість цього ArrayList встановлено метод додавання (int index, object), який простий у використанні та запам'ятовується. Як це, вони мають більш зручні для програмістів і прості у використанні імена функцій в ArrayList.

Коли використовувати який?

  1. Намагайтеся уникати використання Vectors повністю. ArrayLists може робити все, що може зробити Vector. Більше ArrayLists за замовчуванням не синхронізується. Якщо ви хочете, ви можете синхронізувати його коли завгодно, використовуючи клас колекції колекції.
  2. ArrayList легко запам'ятовує та використовує назви функцій.

Примітка . Навіть незважаючи на те, що масив arraylist зростає на 100%, ви можете уникнути цього методом securecapacity (), щоб переконатися, що на початкових етапах ви виділяєте достатню кількість пам'яті.

Сподіваюся, це допомагає.


5
Неправильна інформація (увімкнена) про збільшення розміру для ArrayLIst та Vector, інакше цілком хороша відповідь.
Ненад Булатович

Зростання вектора подвоюється з необхідними docs.oracle.com/javase/7/docs/api/java/util/Vector.html в той час як ArrayList "Деталі політики зростання не вказані, крім того, що додавання елемента має постійна амортизована вартість часу ". docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Мохамед Ель-Накіб

Я не розумію, як назва методу може бути критерієм для використання або не використання цього методу.
Сарандер Херва

14

ArrayListі Vectorобидва реалізує інтерфейс списку та підтримує порядок вставки. Але є багато відмінностей між класами ArrayListта Vectorкласами ...

ArrayList -

  1. ArrayList не синхронізовано.
  2. ArrayList з кроком 50% від поточного розміру масиву, якщо кількість елемента перевищує його ємність.
  3. ArrayList не є спадковим класом, він введений у JDK 1.2.
  4. ArrayList швидко, тому що він не синхронізований.
  5. ArrayList використовує інтерфейс Iterator для переміщення елементів.

Вектор -

  1. Vector синхронізовано.
  2. Vector з кроком 100% означає подвоєння розміру масиву, якщо загальна кількість елемента перевищує його ємність.
  3. Vector це клас спадщини.

  4. Vector є повільним, оскільки він синхронізований, тобто в багатопотоковому середовищі, він буде утримувати інші потоки в стані, що можна виконувати або не запускати, поки поточна нитка не звільнить замок об'єкта.

  5. Vectorвикористовує інтерфейс перерахування для переходу елементів. Але він також може використовувати Iterator.

Дивіться також: https://www.javatpoint.com/difference-between-arraylist-and-vector


10

В основному обидва ArrayList і Vector використовують внутрішній масив Object.

ArrayList: Клас ArrayList розширює AbstractList та реалізує інтерфейс списку та RandomAccess (інтерфейс маркера). ArrayList підтримує динамічні масиви, які можуть зростати за потребою. Це дає нам першу ітерацію над елементами. ArrayList використовує внутрішній масив Object; вони створюються з початковим розміром за замовчуванням 10. Коли цей розмір буде перевищено, колекція автоматично збільшується до половини типового розміру, який становить 15.

Вектор: Вектор схожий на ArrayList, але відмінності полягають у тому, що він синхронізований і його початковий розмір за замовчуванням становить 10, а коли розмір перевищує його розмір збільшується до подвоєного початкового розміру, тобто новий розмір буде 20. Вектор - єдиний клас крім ArrayList для реалізації RandomAccess. Вектор має чотири конструктори, з яких один приймає два параметри. Вектор (int початковаЗамісність, int потужністьПовищення) capacIncrement - це сума, на яку збільшується ємність, коли вектор переповнюється, тому він має більше контролю над коефіцієнтом навантаження.

Деякі інші відмінності: введіть тут опис зображення


1
Чому додавання об’єкта спочатку і в кінці в LinkedList відбувається повільно? Чи не повинно бути швидше BOTH arrayList та vector?
ЧАНИСТ

@CHANist Я теж згоден. Додавання об'єкта на початку та в кінці має бути швидшим, ніж додавання об’єкта в середині.
Рахул Растогі

1
Мова, що використовується у стовпці LinkedList цієї таблиці, суперечлива. І попереднє додавання, і додавання до LinkedList швидше, ніж додавання елементів в середині, але повільніше, ніж попереднє додавання або додавання до ArrayLists або Vectors. Це тому, що кожна вставка вимагає розподілу пам'яті з не локальними посиланнями, збільшуючи ймовірність пропуску кешу. Хоча пошук у LinkedList лінійний з кількістю елементів і покажчик на кінець не зберігається, додавання все ще швидше, ніж попереднє, оскільки пам'ять перерозподілена лише для одного елемента.
Золота Софія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.