java.util.Vector - 替代方案

9 浏览
0 Comments

java.util.Vector - 替代方案

之前,我一直认为在长度未知的情况下,使用Vector来处理非特定对象是不错的选择。据我所知,我还以为它是线程安全的。\n是什么改变了Vector不再适用,有什么替代方案?

0
0 Comments

在Java中,有两个常用的类可以用来存储和操作数据:ArrayList和Vector。然而,现在ArrayList被认为是更好的选择,而Vector被认为是过时的,并且具有额外的性能开销,因为它是线程安全的。

Vector是一个动态数组,它可以根据需要自动增长和缩小。它的线程安全性是通过在每个方法上添加synchronized关键字来实现的,这意味着在任何给定的时间只有一个线程可以修改Vector。这个特性使得Vector在多线程环境下更加安全,但也使得它的性能较差。因为在每个方法调用时都需要获取和释放锁,这会导致额外的开销。

相比之下,ArrayList是一个非线程安全的类,因此在多线程环境下使用它可能会导致并发问题。然而,由于它不需要在每个方法上添加同步关键字,所以它的性能比Vector更好。如果在单线程环境下操作数据,或者可以通过其他方式来处理并发问题,那么ArrayList是更好的选择。

因此,根据当前的Java实现和性能要求,建议使用ArrayList而不是Vector来存储和操作数据。如果确实需要线程安全性,可以考虑使用其他方法来处理并发问题,而不是依赖于Vector的同步机制。

0
0 Comments

在Java中,有时候我们需要使用一个可以动态调整大小的数组。在早期的Java版本中,我们可以使用`java.util.Vector`类来实现这个功能。然而,随着Java的发展,`Vector`类的使用已经不再推荐,因为它有一些不足之处。

一个重要的原因是`Vector`类是线程安全的,这意味着在多线程环境下,多个线程可以同时对同一个`Vector`对象进行读写操作,而不会引发竞态条件等问题。然而,这种线程安全性是通过对所有方法进行同步来实现的,这导致了性能的下降。因此,在单线程环境下,使用`Vector`类可能会带来不必要的开销。

另外一个原因是`Vector`类的扩容机制。当`Vector`对象的容量不足以容纳新的元素时,它会自动增加容量。然而,`Vector`类每次扩容都会将原始数组复制到一个新的更大的数组中,这会导致内存的浪费。相比之下,`ArrayList`类在扩容时只需要将原始数组的引用复制到一个新的更大的数组中,从而节省了内存。

为了解决这些问题,我们可以使用`java.util.ArrayList`类作为`Vector`类的替代品。与`Vector`类不同,`ArrayList`类不是线程安全的。然而,我们可以通过使用`java.util.Collections`类的`synchronizedList`方法来获得一个线程安全的`ArrayList`对象,如下所示:

ArrayList arrayList = new ArrayList();
List synchList = Collections.synchronizedList(arrayList);

通过这种方式,我们可以在多线程环境下安全地使用`ArrayList`,而无需担心竞态条件等问题。同时,由于`ArrayList`的扩容机制的改进,我们也可以获得更好的性能和更少的内存消耗。

`java.util.Vector`类已经不再推荐使用。相反,我们可以使用`java.util.ArrayList`类作为它的替代品。如果需要线程安全性,我们可以使用`Collections.synchronizedList`方法来获得一个线程安全的`ArrayList`对象。这样,我们既可以满足线程安全的需求,又可以获得更好的性能和更少的内存消耗。

0
0 Comments

现在我们来整理一下关于java.util.Vectorjava.util.ArrayList的问题。

问题的原因是,Vector使用内部同步,但这很少能够实现真正的一致性,并且只会在不真正需要的时候减慢执行速度。如果一个集合对多个线程可见,应该使用并充分理解java.util.concurrent中的适当集合。如果集合对多个线程不可见,那么ArrayList更加廉价。消除集合“可能被”多个线程使用的灰色区域:你不能使集合本质上线程安全;集合的客户端如何使用它总是一个因素。

关于Vector是否已经改进或者我们是否必须使用ArrayList,合同规定需要使用同步,所以它实际上无法改进。也就是说,现代的JVM有时可以将同步作为优化的一部分删除,但通常最好使用ArrayList

0