我试图理解为什么 Java 中的向量必须同步。无论我通过谷歌到达哪里,他们都说它是同步的,因为它的元素是同步的,当一个线程正在访问它时,它会阻止其他线程访问。但我真正想知道的是为什么必须这样?Java 应该把它留给访问它的人。但是为什么 Java 强制所有访问 vector 的人使用同步数据结构呢?我同意有人说 ArrayList 可以用于我的要求。但我的意思是那个向量会给我什么?
谢谢和问候, Rengasami Ramanujam
历史。
Vector
是 JDK 1.0 的一部分;ArrayList
不是。我们了解到,默认同步意味着性能不佳,因此当 Java Collections API 出现时它被逆转了。
您仍然可以选择使用 中的方法同步您需要的任何集合java.util.Collections
,但这是您的选择。
您还应该了解作为java.util.concurrent
包一部分的集合。同时访问集合当然需要精心设计。
但我的意思是那个向量会给我什么?
这是一个“遗留”类。
除非您特别需要同步列表类,否则Vector
在编写新代码时不会给您任何帮助。
然而,Vector
它(仍然)在那里是有充分理由的。原因是允许您运行为使用 Java 1.0 和 Java 1.1 而编写的旧 Java 代码,或者在一些不包含 Java 集合框架的 Java ME 配置文件上运行。而且它必须(仍然)同步,因为如果他们改变了它,任何使用的多线程遗留代码都Vector
可能中断。
考虑这个示例,它表明您仍然需要在应用程序代码中使用同步。
// BROKEN CODE, needs external synchronization
// only add an element if the vector is empty
if(vector.isEmpty())
vector.add(anElement);
为什么是向量?取决于你在做什么
在内部,ArrayList 和 Vector 都使用 Array 保存它们的内容。在您的程序中使用任何一个时,您都需要牢记这一事实。将元素插入 ArrayList 或 Vector 时,如果对象空间不足,则需要扩展其内部数组。Vector 默认将其数组大小增加一倍,而 ArrayList 将其数组大小增加 50%。根据您使用这些类的方式,您最终可能会在添加新元素时受到很大的性能影响。最好将对象的初始容量设置为程序所需的最大容量。通过仔细设置容量,您可以避免支付稍后调整内部数组大小所需的代价。如果您不知道您将拥有多少数据,但您确实知道它的增长速度,
您不必被迫使用 aVector
您也可以使用ArrayList
s。
如果您使用线程,如果它同步,您会很高兴。如果您的应用程序不使用线程,我会使用比Vector
.
使 Vector 同步正是编写该 Java 库的人决定实现它的方式。ArrayList 和 Vector 都在内部作为数组实现,两者都是动态调整大小的,但 Vector 的大小是capacityIncrement
当前数组大小的两倍,而对于 ArrayList,它是当前大小的一半。Vector 较慢,因为您必须检查是否有其他线程在另一个线程之前访问它。
如果您需要同步的 List 数据结构,最好synchronizedList(List list)
从Collections API 中使用。
如果要同步整个操作序列,请使用 arrayList。像矢量一样同步单个运算符不太安全。
如果不需要线程安全操作,建议使用 ArrayLists。