Подтвердить что ты не робот

Используйте Hashtable, Vector или HashMap или ArrayList в Java

Один meme, который получает ударение при разработке Java, всегда использует ArrayList над Vector. Вектор устарел. Это может быть правдой, но Vector и Hashtable имеют то преимущество, что они синхронизированы.

Я работаю с сильно параллельным ориентированным приложением, не выгодно ли использовать объекты, синхронизированные подобно Vector? Кажется, что у них есть свое место?

4b9b3361

Ответ 1

Проблема с Vector и Hashtable заключается в том, что они только локально синхронизированы. Однако они не будут ломаться (как в поврежденных данных) в параллельном приложении, однако из-за локальной синхронизации (например, get синхронизируется, но только до тех пор, пока не будет получен возврат), вы все равно захотите выполнить свою собственную синхронизацию для ситуаций, таких как как итерация по содержанию. Теперь даже ваш put-method нуждается в дополнительной синхронизации для взаимодействия с итерационной синхронизацией, и вы получите ситуацию, когда ваш Hashtable/Vector дважды синхронизирован.

Ответ 2

ConcurrentHashMap путь быстрее, чем Хеш-таблица. Он параллельный, а не только синхронизирован. Он допускает сразу несколько читателей/писателей.

Однако такого "параллельного" списка массивов нет. В зависимости от ваших потребностей CopyOnWriteArrayList может быть или не быть тем, что вам нужно.

Ответ 3

Если вам нужно синхронизировать ArrayList или HashMap, вы можете их обернуть.

List list = Collections.synchronizedList(new ArrayList(...));
Map m = Collections.synchronizedMap(new HashMap(...));

Лично я считаю, что "синхронизированные" методы в этих сборках не очень полезны в тяжелом потоковом коде. Есть несколько новых коллекций, которые помогают намного больше, но в основном я нахожу, что делаю свои собственные синхронизирующие объекты и синхронизирую вокруг них или используя новые блокировки в java.util.concurrent

Ответ 4

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

Также обратите внимание, что Collections.synchronizedList() можно использовать для создания синхронизированного представления в любой реализации List, поэтому у вас нет для привязки к характеристикам Vector (например, вам может понадобиться синхронизированный LinkedList).

Ответ 6

Мне кажется, что единственное, что вам понадобится для самой коллекции, должно быть:

  • Если коллекция видна вне класса (общедоступная или по умолчанию)
  • Если вы возвращаете дескриптор коллекции из метода
  • Если коллекция является статическим членом вашего класса

Все это, вероятно, плохие идеи по дизайну.

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