首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中,我可以使用什么来代替Vector?

在Java中,我可以使用什么来代替Vector?
EN

Stack Overflow用户
提问于 2011-03-09 06:19:16
回答 5查看 10.4K关注 0票数 6

看起来,在Java编程中,当涉及到线程时,我们不应该再使用Vectors。

在使用线程时,我应该使用什么类来代替Vector?

代码语言:javascript
复制
import java.util.Vector;
Vector<String> v = new Vector<String>();
EN

回答 5

Stack Overflow用户

发布于 2011-03-09 06:41:38

看起来在

中编程时,当涉及到线程时,我们不应该再使用向量了。

您需要理解为什么在大多数情况下使用Vector被认为是一件坏事。原因是:

  • Vector在每个操作上都会同步。大多数上下文不需要细粒度同步,因此这是不必要的性能开销。
  • Vector.elements()方法返回没有快速失败语义的Enumeration

把这个带回你的问题。替代方案取决于你的线程想要做什么:

  • 如果使用情形根本不需要同步,请使用ArrayListLinkedList。您通常会在以下条件下使用:

代码语言:javascript
复制
- The list is thread-confined; i.e. only one thread ever can access it.
- The list requires coarse-grained synchronization; i.e. exclusive access while performing a sequence of operations.  In this case, you would typically create a custom class with an embedded (say) `ArrayList` that is not exposed in the custom classes API.

  • 如果用例需要细粒度的同步,那么Collections.synchronizedList包装器就相当于Vector。或者,您可以坚持使用Vector,并避免使用elements()操作。
  • CopyOnWriteArrayList list的优势在于它的迭代器支持并发修改...从某种意义上说。如果您的应用程序主要执行读取列表,那么它的伸缩性也会更好。读操作根本不需要显式同步,通常只需要读取单个volatile一次。但另一方面,写操作确实是同步的,而且比“普通”ArrayList.

的开销要高得多

VectorCollections.synchronizedList包装器的另一个问题是,一些用例需要更粗略的同步;例如,测试列表的大小和在单个同步操作中有条件地添加元素。QueueDeque类提供了更高级别的抽象来处理这类事情...用于涉及将工作从一个线程异步传递到另一个线程的用例。

底线是没有万能的解决方案。您需要了解应用程序设计的并发特征,并相应地选择您的数据结构。

最后,如果您正在为Java编程,您可能会坚持使用Vector,这取决于您的目标J2ME概要文件。

票数 15
EN

Stack Overflow用户

发布于 2011-03-09 06:21:21

代码语言:javascript
复制
List<String> list = Collections.synchronizedList(new ArrayList<String>());
票数 5
EN

Stack Overflow用户

发布于 2011-03-09 06:22:46

对于线程不安全的情况,请使用ArrayList

对于线程安全的情况,可以使用任何最适合您的情况,CopyOnWriteArrayListQueueBlockingDeque等。要获得更多建议,我们需要知道您是如何处理集合的。

我建议不要使用Collections.synchronizedList(...)包装器,因为它可能伸缩性不够好(除非您不太关心可伸缩性)。但这完全取决于您的上下文。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5239066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档