ArrayList и вектор
ArrayList vs Vector
Вектор реализует массивы, которые могут расти / сокращаться во время выполнения, когда некоторые элементы добавляются или удаляются из него. Доступ к элементам осуществляется с помощью целочисленного индекса. Два поля - прирост емкости и емкости, характеризуют управление хранением векторов. Он реализует четыре интерфейса: * Список * Случайный доступ * Клонирование * Сериализуемые интерфейсы
ArrayList, как и векторы, также реализует четыре интерфейса. Опять же, как и векторы, его размер может измениться во время выполнения. Кроме того, у него есть поле с именем capacity, размер которого равен размеру ArrayList. Оба вектора и ArrayList хороши для извлечения элементов из любой позиции, а также для вставки или удаления элементов из конца класса контейнера. С точки зрения API, как векторы, так и ArrayList очень похожи. Итак, где именно лежит разница между этими двумя? Следующие моменты проливают свет на этот вопрос:
1. Синхронизация: векторы синхронизированы, но ArrayList - нет. Если вы добавляете или удаляете элементы из ArrayList, это называется структурной модификацией. Когда несколько потоков обращаются к ArrayList одновременно с блоком кода, изменяющим список, тогда необходимо синхронизировать список извне. Короче говоря, содержимое векторов является потокобезопасным, а ArrayList - нет. Если в требовании не упоминается потокобезопасная коллекция, тогда следует выбрать ArrayList, поскольку производительность синхронизации возрастает. Несинхронизированные ArrayList бывают быстрыми. 2. Рост данных: как ArrayList, так и векторные элементы хранятся в виде массивов, но векторы имеют размер по умолчанию 10, а ArrayList не имеет размера по умолчанию. Когда вы добавляете элемент к ArrayList или вектору, есть вероятность, что любой из классов может закончиться. В таком случае по умолчанию Vector удваивает свой размер, а размер ArrayList увеличивается на 50%. Вы можете установить значение приращения в случае векторов, что невозможно для ArrayList. 3. Перемещение элементов: у ArrayList есть преимущество, так как вы можете получить доступ к его элементам, просто используя индекс. В случае векторов вам необходимо создать итератор для перемещения его элементов. Резюме: 1. Если класс контейнера должен быть изменен одним потоком или некоторой локальной переменной, тогда вы должны использовать ArrayList. 2. Когда к классу контейнера обращаются несколько потоков, тогда используйте векторы, иначе вам придется выполнять ручную синхронизацию. 3. Мы можем указать размер приращения с помощью вектора, а с помощью ArrayList мы не сможем. 4. Вектор синхронизирован, а ArrayList - нет. 5. Вектор может увеличивать размер вдвое; ArrayList может увеличить его на 50%.