Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/60: Рейтинг темы: голосов - 60, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 20.08.2008
Сообщений: 4
1

Разница между Vector и ArrayList

20.08.2008, 17:35. Показов 11428. Ответов 16
Метки нет (Все метки)

Какая разница между Vector и ArrayList?

Как правелнее объявлять переменую типа ArrayList?
1) ArrayList variable=new ArrayList;
2) List variable=new ArrayList;
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2008, 17:35
Ответы с готовыми решениями:

В чем разница между new ArrayList<String>() и new ArrayList<>()?
подскажите,знатоки,в чем разность между ArrayList &lt;String&gt; stringList = new ArrayList&lt;String&gt;();...

Разница между list и vector
Подскажите пожалуйста в чем различие между листами и векторами? Сколько не пытался не смог найти...

Разница между list и vector?
Разница между list и vector?

Какая разница между различными сокетами (например, между 775 и 1155)?
Обясните пожалуйста какая разница между сокетами, пример есть сокет 775 и 1155 я понимаю что разем...

16
Sergey_
20.08.2008, 18:14 2
Vector, в отличие от ArrayList, является synchronized, то есть существует механизм синхронизации работы нескольких различных потоков с Vector. Из-за этого операции с Vector несколько медленнее, чем с ArrayList. Если приложение не содержит нескольких потоков, которые должны одновременно записывать информацию в список, то конечно нужно использовать ArrayList, а не Vector.

Ситуации, когда лучше использовать объявление List variable=new ArrayList(); существуют, но встречаются редко. Лучше не извращаться без причины и использовать ArrayList variable=new ArrayList();
0 / 0 / 4
Регистрация: 14.08.2007
Сообщений: 307
20.08.2008, 18:18 3
объявить можно как угодно :

Java
1
2
3
4
ArrayList variable = new ArrayList();
List variable = new ArrayList();
Collection variable = new ArrayList();
AbstractList variable = new ArrayList();
Просто , если ты объявишь переменную типа суперкласса или интерфейса ,а тебе потребуется вызвать у объекта метод специфичный для этого класса нужно будет приводить тип:
Java
1
(ArrayList)variable.trimToSize();
а по поводу отличий ArrayList и Vector можешь почитать здесь:
http://www.javapower.ru/java/b... Heading315
0
0 / 0 / 0
Регистрация: 20.08.2008
Сообщений: 4
20.08.2008, 18:29  [ТС] 4
Проблема в том, что Професор в Университете говорит что мы должны использовать ArrayList, потому что Vector усторел. И ругается когда видит что кто то использует Vector. Хотя в Swing используется только Vector.
А насчет инициализации, то на теоретической контрольной нам снижают оценки если мы пишем ArrayList variable=new ArrayList();
Я думаю что так и надо, как мне Профу объяснить что можно и так?
0
Sergey_
20.08.2008, 18:58 5
Не стоит объяснять Профессору, что он не прав. Целее будешь. А переубедить его все равно не сможешь, так как он отошлет тебя к классикам (например, Bill Brogden) у которых черным по белому написано, что Vector устарел.
0 / 0 / 0
Регистрация: 20.08.2008
Сообщений: 4
20.08.2008, 19:06  [ТС] 6
Ну спасибо, утешил.
0
mishgun
20.08.2008, 21:16 7
Пошлите его про себя сделайте как он хочет а потом просто напишите мнгогопоточную прогу и после выпуска ткните его носом в эту прогу(тогда уже не больно будет ))))
0 / 0 / 0
Регистрация: 27.02.2008
Сообщений: 56
21.08.2008, 09:10 8
Что-то вы, мужики, не по делу наехали на ArrayList. Во-первых, что касается синхронизации: как-то вы скромно умолчали о том, что можно получить синхронизированный List легким движением руки:
Java
1
List list = Collections.synchronizedList(new ArrayList());
При этом теряются методы, не входящие в интерфейс List, но единственный практически ценный из них - ensureCapacity(), который может быть вызван до приведения.
А насчет того, почему ArrayList в исходном виде не синхронизирован, вполне понятно: синхронизация многопоточного приложения может делаться где-нибудь совсем в другом месте и, натыкивая синхронизированных методов где ни попадя, вы только замедлите прогу.
Теперь о том, что там устарело. Что до меня, то меня очень устраивает ситуация, когда помимо динамических массивов существуют также связные списки, и оба используют одинаковые имена методов: работать удобно. Похожая ситуация с Hashtable / HashMap, TreeMap. Поэтому рискну согласиться с профессором. А почему в коде Swing используются Vector, вполне понятно: когда начинал писаться Swing, интерфейса Collection и его реализаций не существовало.
0
0 / 0 / 0
Регистрация: 27.02.2008
Сообщений: 56
21.08.2008, 12:44 9
Вдогонку, по поводу того, почему вас заставляют использовать переменные типа List, а не ArrayList. Вот вообразите себе ситуацию: вы написали большую прогу, и в ней используется объект класса ArrayList. Он создается в некоем методе, а затем используется многими объектами, например, через какой-нибудь контекст. И вот однажды, при отладке или при внедрении, или вообще в ходе эксплуатации, вы обраруживаете, что поведение ArrayList вас не устраивает: медленные вставки, не поддерживает свопинг, что угодно. Нужно заменить реализацию. Но теперь вам придется пойти по одному из двух путей:
1. Во всех модулях программы найти, где объявляются ваши переменные ArrayList и заменить тип этих переменных на ваш новый.
2. Сделать вашу новую реализацию производным классом от ArrayList.
Оба способа уродливые: первый - геморрой страшный, второй - довольно нелогично использовать класс там, где должен быть интерфейс.
Ситуация будет еще хуже, если вы разработали библиотеку или просто reusable компонент, и на базе этого уже наверчена куча другого софта: разработчики этого самого софта вас с дерьмом сожрут.
Это, кстати, также объясняет, почему устарел Vector.
0
0 / 0 / 0
Регистрация: 20.08.2008
Сообщений: 4
21.08.2008, 21:23  [ТС] 10
Ok
А представь что кто то создал програму в которой использует List a=new Vector(); и возвращает этот List. А я думаю что это ArrayList и пишу всю программу для него.
И потом что мне использоват со Swing?
0
0 / 0 / 4
Регистрация: 14.08.2007
Сообщений: 307
21.08.2008, 22:13 11
ты не думай что это Vector , думай что List , а если тебе действительно важно знать экземпляр какого класса это на самом деле -
то для этого существует instanceof или variable.class.isInstance(...)
0
0 / 0 / 4
Регистрация: 14.08.2007
Сообщений: 307
21.08.2008, 22:17 12
а насчёт Swing - не Swing :
используешь то , что лучше подходит в каждом конкретном случае
0
0 / 0 / 0
Регистрация: 27.02.2008
Сообщений: 56
24.08.2008, 08:38 13
to nesher
Вот это и есть тот неправильный подход, от которого тебя пытается избавить твой профессор. Если тебе вернули переменную типа List (или в документации на библиотеку сказано, что в каком-нибудь контексте содержится объект типа List), это есть прямое указание, что ты не должен думать, какого на самом деле класса объект, а должен пользоваться только методами интерфейса List. Там может быть что угодно, но если ты начнешь умствовать: использовать интроспекцию, или просто строить какие-либо предположения, то получится, что вместо того, чтобы пользоваться помощью, которую тебе предлагает инструмент разработки для избежания ошибок, ты будешь бороться против этого инструмента. А такой подход приводит всегда к одинаковому результату: появлению ПО, которое потом невозможно сопровождать. Безусловно, приятно иметь побольше возможностей, но, к сожалению, без определенной дисциплины программирования написать сколько-нибудь крупную систему невозможно.
Надо сказать, что ты - не первый студент, который считает, что преподаватели - большей частью оторванные от жизни ребята, помешанные на бесплодных концепциях (я тоже так думал много лет назад ;-) ), но в конце концов выясняется, что все это - совсем не такая уж чушь, как казалось с первого взгляда.
0
0 / 0 / 0
Регистрация: 27.02.2008
Сообщений: 56
24.08.2008, 09:17 14
Кстати, насчет того, что использовать со Swing. Дело в том, что java.util и javax.swing - совершенно независимые пакеты (извини, если прозвучало банально). Из этого следует, что вне зависимости от того, используешь ты Swing или нет, подходы к работе с java.util никаким образом меняться не будут. Таким образом, правильно будет использовать ArrayList (или, если необходимо, LinkedList) во всех случаях.
0
0 / 0 / 4
Регистрация: 14.08.2007
Сообщений: 307
24.08.2008, 22:22 15
2 Itsme:
Спасибо коллега , что Вы заметили,
что использование интроспекции в ДАННОЙ ситуации
- мягко говоря 'неправильный подход'.
Полностью с Вами согласен , только добавлю что я написал (прочтите внимательнее )
'ты не думай что это Vector , думай что List ', имея в виду то же самое , что и Вы ,хотя конечно не настолько красноречиво как Вы.
Но интроспекцию всё же для чего то придумали ,
и я показал молодому человеку , что в Java есть такие механизмы .

А насчёт
'правильно будет использовать ArrayList (или, если необходимо, LinkedList) ВО ВСЕХ СЛУЧАЯХ',
- в реальной жизни бывают случаи , когда вы обязаны использовать именно Vector ,
а не одну из имплементаций List.
Например апплет для интернет,
если вы хотите чтобы ваш апплет работал и в броузерах не поддерживающих Java2
( а таких на сегодняшний день ,насколько я понимаю - к сожалению большинство ).O Swing в такой ситуации естественно и речи нет.
0
0 / 0 / 0
Регистрация: 27.02.2008
Сообщений: 56
25.08.2008, 08:33 16
to scroodge
Да, я заметил, что вы сказали про 'не думать', но, судя по сообщениям от nesher, требовались более подробные разъяснения, почему так думать не нужно. Что касается апплетов: вы, конечно, правы: если конкретная реализация Java не поддерживает ArrayList, то использовать его было бы довольно затруднительно :-( Однако если вы работаете с Java-2, видится разумным использовать его действительно во всех случаях.
0
0 / 0 / 0
Регистрация: 27.02.2008
Сообщений: 56
25.08.2008, 08:34 17
to scroodge
Да, я заметил, что вы сказали про 'не думать', но, судя по сообщениям от nesher, требовались более подробные разъяснения, почему так думать не нужно. Что касается апплетов: вы, конечно, правы: если конкретная реализация Java не поддерживает ArrayList, то использовать его было бы довольно затруднительно :-( Однако если вы работаете с Java-2, видится разумным использовать его действительно во всех случаях.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2008, 08:34

Сумма между min и max значениями массива ArrayList
Подскажите плз! создал массив случайных чисел : public class MinMaxBody { public int...

Передача std::vector между классами
Класс Data служит для инициализации переменных. Класс А - для обработки данных. В классе А меняются...

Разница между != и <>?
есть ли разница между операторами != и &lt;&gt;, или они полностью эквивалентны? или &lt;&gt; это эквивалент...

Разница между --f и f--
Не понимаю, читал, что разницы между --f и f-- вообще никакой нет, но при компиляции программы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.