java.util.Vector - 替代品

ST.*_*ST. 28 java vector arraylist

以前我总是认为当长度未知时,Vector可用于非描述对象.据我所知,我认为它也是线程安全的

什么是Vector不应该再使用的改变,替代方案是什么?

Pau*_*and 38

你应该使用ArrayList而不是Vector.Vector使用内部同步,但这对于实际的一致性来说很少是足够好的,并且只有在不需要时才会减慢执行速度.

另请参阅此stackoverflow问题.

  • 关于很少"足够实际一致性"的好处.如果一个集合对多个线程可见,那么您应该使用(并且完全理解)来自`java.util.concurrent`的适当集合.如果它不能被多个线程访问,那么`ArrayList`会更便宜.消除多个线程使用"可能"集合的灰色区域:您无法使集合本身具有线程安全性; 客户如何使用它始终是一个因素. (11认同)

hex*_*ium 16

你可以ArrayList改用.

如果您需要同步版本,您可以执行以下操作:

ArrayList arrayList = new ArrayList();

List synchList = Collections.synchronizedList(arrayList);
Run Code Online (Sandbox Code Playgroud)


Kyl*_*ndo 7

ArrayList现在是更好的课程.Vector现在被认为是Legacy,并且具有线程安全性的额外性能开销.


Dón*_*nal 7

使用ArrayList时,你需要一个List实现,但并不需要线程安全,并且使用CopyOnWriteArrayList时您需要List是线程安全的实现.


Jes*_*per 6

Vector是Java 1.0的遗留集合类.在Java 1.2(很久以前!)中,添加了集合框架,其中包括新的集合类,例如ArrayListHashMap,它们旨在替换遗留类VectorHashtable.

如前所述,遗留集合类具有内置同步,这对于许多应用程序来说是不必要的.同步具有性能开销,因此如果没有必要,则不应使用它.

在某些情况下(当您的程序是多线程的,并且多个线程访问相同的数据时),您需要同步您的集合.然后有些人会使用旧的VectorHashtable类,但更好的方法是使用同步包装器,例如ArrayList:

// Your standard, unsynchronized list
List<String> data = new ArrayList<String>();

// Use this to put it into a synchronization wrapper
List<String> syncedData = Collections.synchronizedList(data);
Run Code Online (Sandbox Code Playgroud)

有关Collections.synchronizedList()更多信息,请参阅(和其他方法)的API文档.

  • 如果需要线程安全的List,CopyOnWriteArrayList提供比Collections.synchronizedList(data)更好的性能(在大多数情况下) (6认同)