Преждевременная оптимизация является первопричиной всех бед в программировании. Дональд Кнут

Vector или ArrayList – что лучше и почему?

Найдите разницу между Vector’ом и ArrayList’ом.

Иногда лучше использовать Vector, иногда ArrayList, в некоторых случаях лучше не использовать ни то ни другое.  Существует четыре фактора, влияющих на принятие решения – что и когда лучше использовать, а именно:

  • API
  • Синхронизация
  • Хранение данных
  • Реализация

Давайте более подробно остановимся на каждом из них.

API

В издании The Java Programming Language (Addison-Wesley, June 2000) Кен Арнолд, Джеймс Гослинг и Девид Холмс описывают Vector как аналог ArrayList’а. Из этого следует, что с точки зрения API, оба класса очень похожи. Тем не менее, между этими двумя классами всё-таки есть существенные различия.

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

Экземпляры класса Vector являются синхронизированными и каждый метод класса Vector является потокобезопасным, в то время как ArrayList имеет прямо противоположное описание: он не является синхронизированным и не является потокобезопасным. Из этого следует, что использование Vector’a в конечном итоге понижает производительность из-за обеспечения синхронизированного доступа к данным коллекции. Поэтому, если вам не нужна коллекция, обеспечивающая потокобезопасный доступ к данным (т.е. Vector), используйте ArrayList, зачем платить больше?

Хранение данных

Обе коллекции Vector и ArrayList используют массив для хранения данных. Вам нужно помнить об этом всегда. Массив, хранящий элементы, расширяется в том случае, когда он уже является полностью заполненным в момент добавления нового элемента. Каким образом реализуется расширение массива? Если мы просмотрим исходный код классов Vector и ArrayList, мы заметим, что в Vector’е происходит увеличение массива вдвое, в то время как в ArrayList’е массив увеличивается на 50%. Это является ещё одним местом, где может осуществляться существенное падение производительности. Поэтому, создавая коллекцию, задумайтесь, какой именно коэффициент вместимости (инишиал кепестити) нужен коллекции, и нужен ли он вообще. Это позволит вам избежать дополнительных расходов при расширении массива.

Реализация

Обе коллекции Vector и ArrayList являются хорошим решением при индексировании данных, извлечении элементов с определённой позиции, а так же при добавлении/удалении элемента в/из конец/конца списка. Если вы хотите добавлять/удялать элементы в начале либо в середине списка, используйте LinkedList. Этот класс позволяет добавлять либо удалять элементы с любых позиций за фиксированное время O(1). Однако индексирование в LinkedList обойдётся вам дороже чем в Vector/ArrayList по времени и определяется как O(i), где i – индекс элемента.

Если вы разрабатываете код, где производительность играет первоочередную роль, задумайтесь над использованием массива вместо списка – это позволит вам избежать затрат на синхронизацию, затрат на вызов методов, а также затрат на расширение массива. Но за это вам придеться расплачиваться временем, затраченным на разработку.

Источник: JavaWorld

Тэги: , , ,

4 Responses to “Vector или ArrayList – что лучше и почему?”

  1. mind |

    Скажу честно, все не читал, но в конце выводы – из пальца.
    “Если вы разрабатываете код, где производительность играет первоочередную роль, задумайтесь над использованием массива вместо списка – это позволит вам избежать затрат на синхронизацию, затрат на вызов методов, а также затрат на расширение массива. Но за это вам придеться расплачиваться временем, затраченным на разработку.”
    Фактически сказано:
    1. доступ к элементам массива синхронизирован – реально если элементы изменяются, синхронизация понадобится. если не изменяются – обходить список без синхронизации абсолютно безопасно
    2. массив расширается автоматически – на самом деле, расширение массива требует памяти и операций копирования
    3. использование массива вместо списка требует больше времени на кодирование – учитывая, что пункты 1 и 2 автор не предусматривает, то считаю, что наоборот.

    А вообще скажу – неинтересно.

  2. Evgenij Nerush |

    >Скажу честно, все не читал, но в конце выводы – из пальца.

    А Вы почитайте, иначе ваши выводы – из пальца.

    >массив расширается автоматически – на самом деле,
    >расширение массива требует памяти и операций копирования.

    А вот о падении производительности в момент расширения массива было явно сказано.

  3. Brim.ru |

    >мы заметим, что в Vector’е происходит увеличение массива вдвое
    - по умолчанию в два раза, но у Vector-а есть конструктор в котором можно задать шаг приращения массива при его заполнении

  4. Гость |

    а как на счет Collections.SynchronizedList? Можно использовать потокобезопасные списки без использования контейнера Vector. Напишите об этом

Оставить сообщение