2013-07-13 1 views
1

Прежде всего, я должен сказать, что в моей книге (2005) Vector<E> (широко используется) вместо массивов. В то же время нет никакого объяснения различий между ними. Проверка Oracle Doc на класс Vector довольно легко понять его использование.Коллекции: Array, Vector и ArrayList. Различия и соответствующее использование

Выполнение некоторых дополнительных исследований на StackOverflow и Google, я обнаружил, что Vector класс фактически устарел и использовать ArrayList вместо это правильно?I also found an extensive explanation about differences between Array and ArrayList.

Та часть, я не могу понять: Есть ли правило о том, где я должен использовать ArrayList вместо простых массивов? Кажется, я всегда должен использовать ArrayList. Он выглядит более эффективным и должен быть проще реализовать коллекции значений/объектов, есть ли какая-либо сторона этого подхода?

+2

'Vector' vs' ArrayList': [Почему класс Java Vector считается устаревшим или устаревшим?] (Http://stackoverflow.com/q/1386275/1065197). Массивы против 'List', поддерживаемые' ArrayList': это будет зависеть от вашего дизайна, но я бы предпочел бы, чтобы «List» был динамическим и уже обрабатывал все операции (добавление, удаление, получение) вместо их переписывания, также вы можете использовать 'Array # asList' для перемещения массива в' List' и 'List # toArray' для наоборот. –

+1

Нет такой вещи, как 'Array', кроме' java.lang.reflect.Array', который является классом утилиты для манипуляций с массивами. Не смешивайте это и 'ArrayList', который является реализацией интерфейса' List'. – fge

+1

@fge, когда OP относится к * Array *, это означает простой массив примитивов или объектов типа 'int []' или 'Object []'. –

ответ

4

Немного истории:

  • Vector существует с Java 1.0;
  • List Интерфейс существует с Java 1.2, и так же ArrayList;
  • Vector был модернизирован для реализации интерфейса List в то же самое время;
  • Java 5, представляющая дженерики, была введена в 2004 году (link).

Ваш курс, датируемый 2005 годом, должен был знать о ArrayList в самом списке (извините, по крайней мере), а также должен был ввести дженерики.

Что касается Array, то есть java.lang.reflect.Array, что помогает с отражениями по массивам (то есть int[] и т. Д.).

В основном:

  • Vector синхронизирует все операции, которая представляет собой отходы в 90 +% случаев;
  • если вы хотите параллельные коллекции, Java 5 ввел ConcurrentHashMap, CopyOnWriteArrayList и т.д., вы должны использовать их;
  • НЕ используйте Vector больше ни в коем случае; некоторый код в JDK по-прежнему использует его, но для соображений обратной совместимости. В новом коде есть лучшие альтернативы, как упоминалось в предыдущем пункте;
  • поскольку Java 1.2, Vector не предлагает те же гарантии безопасности потоков, что и раньше.

Последний вопрос интересный. До Iterator было Enumeration, а Enumeration не предлагалось удалить элементы; Iterator, однако.

Итак, давайте возьмем две нити t1 и t2, а Vector, и эти две темы, имеющие Iterator над этим вектором. Тема t1 делает:

while (it.hasNext()) 
    it.next(); 

Thread t2 делает:

// remember: different iterator 
if (!it.hasNext()) 
    it.remove(); 

С некоторым несчастливого временем, у вас есть:

t1     t2 
------    ------ 
hasNext(): true 
        .hasNext(): false 
        removes last element 
.next() --> BOOM 

Поэтому Vector фактически не поточно. И это даже меньше потокобезопасно, так как введение Java 5 в «цикл foreach», который создает «скрытый» итератор.

+0

Большое спасибо за подробный ответ! – jnardiello

0

класс Vector фактически устарел и использовать ArrayList вместо этого, это правильно?

Да, это правильно. Вектор класса и некоторые другие коллекции устарели и заменены новыми коллекциями, как ArrayList, карта и т.д. Вот few причины Вектор Устаревшие

Есть ли правило о том, где я должен использовать ArrayList вместо простых Массивы ?

Практически всегда. Я могу подумать о двух причинах, почему вы должны использовать массивы:

  • Делает вызовы JNI проще. Намного проще отправить простой массив из C++ в Java, чем объект ArrayList
  • Вы можете получить немного производительности, поскольку доступ к элементам простого массива не требует проверок границ и вызовов методов.

С другой стороны, использование ArrayList дает много преимуществ. Вам не нужно думать о том, как контролировать размер массива при добавлении нового элемента, вы можете использовать простой API ArrayList для добавления/удаления элементов из вашей коллекции и т. Д.

+0

Почему« Вектор » 'устарел? В вашей ссылке обсуждаются различия и указано, что обе имеют преимущества и недостатки. – nif

+0

@nif Извините, моя вина. Обновлена ​​ссылка. –

3

Основное различие между array и ArrayList состоит в том, что массив имеет фиксированный размер, тогда как ArrayList может динамически расти по мере необходимости. Итак, если вы уверены, что размер вашего массива не изменится, вы можете его использовать. Но если вы хотите добавить элементы позже, то это будет ArrayList, который является реализацией интерфейса .

Хотя ArrayList внутренне поддерживается только array. Таким образом, внутренне он также использует массив фиксированного размера с начальной емкостью (что может измениться в этом отношении), но эта деталь внутренне скрыта. Таким образом, вам не нужно беспокоиться об изменении размера ArrayList.

Всякий раз, когда вы добавляете элементы больше, чем текущий размер массива в ArrayList, внутренний массив расширен. Это означает, что регулярное расширение размера может стать накладным, если вы регулярно вставляете большое количество элементов. Хотя это редко бывает. Тем не менее, вы также можете указать свой собственный начальный размер при создании ArrayList. Итак, это вам решать.

Что касается VectorArrayList против обсуждения, да Vector теперь осуждается (технически не хотя, но его использование не рекомендуется, как указано в комментариях по @Luiggi), и вы должны использовать ArrayList. Разница в том, что Vector синхронизирует каждую операцию, что почти никогда не требуется. Когда вам нужна синхронизация, вы всегда можете создать синхронизированный список, используя Collections.synchronizedList.

Подробнее об этом обсуждении см. this post.

ArrayList - это реализация List. Существуют и другие варианты. Как и у вас также есть LinkedList, чтобы получить функциональность связанного списка .

+2

* «Вектор» теперь устарел * он технически не рекомендуется, но его использование сильно обескуражено, подобно скриптлетам для JSP. –

+0

@LuiggiMendoza. Да, должен был добавить это. Спасибо :) –

+1

@Downvoter Пожалуйста, оставьте комментарий. Что-то не так с этим сообщением? –

0

Я просто добавлю свои два цента.

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

Смежные вопросы