一些历史:
Vector
从 Java 1.0 开始存在;
- 该
List
接口自 Java 1.2 以来就存在,因此也存在ArrayList
;
Vector
同时进行了改造以实现List
接口;
- 引入泛型的 Java 5 已于 2004 年推出(链接)。
你的课程,可以追溯到 2005 年,应该ArrayList
在列表中就有知识(抱歉,至少),并且应该也引入了泛型。
至于Array
,有java.lang.reflect.Array
,它有助于对数组进行反射(即int[]
,等)。
基本上:
Vector
同步所有操作,这在 90+% 的情况下是一种浪费;
- 如果你想要并发集合,Java 5 已经引入
ConcurrentHashMap
等等CopyOnWriteArrayList
,你应该使用那些;
Vector
在任何情况下都不要再使用;JDK 中的一些代码仍然使用它,但这是出于向后兼容性的原因。在新代码中,有更好的替代方案,如上一点所述;
- 从 Java 1.2 开始,
Vector
不再提供与过去提供的相同的线程安全保证。
后一点很有趣。之前Iterator
有Enumeration
,并且Enumeration
没有提供删除元素的可能性;Iterator
,但是,确实如此。
因此,让我们取两个线程t1
和t2
,a ,以及在该向量Vector
上具有 a 的那两个线程。Iterator
线程t1
做:
while (it.hasNext())
it.next();
线程t2
做:
// remember: different iterator
if (!it.hasNext())
it.remove();
由于一些不幸的时机,你有:
t1 t2
------ ------
hasNext(): true
.hasNext(): false
removes last element
.next() --> BOOM
因此,Vector
实际上不是线程安全的。自从 Java 5 引入“foreach 循环”以来,它的线程安全性甚至更低,它创建了一个“隐藏”迭代器。