为什么Java中的向量必须同步?

为什么Java中的向量必须同步?,java,vector,Java,Vector,我试图理解为什么Java中的向量必须同步。无论我通过谷歌到达哪里,他们都说它是同步的,因为它的元素是同步的,当一个线程访问它时,它会阻止其他线程访问。但我真正想知道的是为什么必须这样做?Java应该把它留给访问它的人。但是为什么Java强制所有访问vector的人使用同步数据结构呢?我同意有人说ArrayList可以用于我的需求。但我的观点是向量将给我什么?? 感谢和问候, Rengasami Ramanujam您不必被迫使用向量您也可以使用数组列表s 如果你使用线程,你会很高兴它是同步的。如果

我试图理解为什么Java中的向量必须同步。无论我通过谷歌到达哪里,他们都说它是同步的,因为它的元素是同步的,当一个线程访问它时,它会阻止其他线程访问。但我真正想知道的是为什么必须这样做?Java应该把它留给访问它的人。但是为什么Java强制所有访问vector的人使用同步数据结构呢?我同意有人说ArrayList可以用于我的需求。但我的观点是向量将给我什么??

感谢和问候,
Rengasami Ramanujam

您不必被迫使用
向量
您也可以使用
数组列表
s


如果你使用线程,你会很高兴它是同步的。如果你的应用程序不使用线程,我会使用比
向量更快的东西
你不会被迫使用
向量
你也可以使用
数组列表

如果你使用线程,你会很高兴它是同步的。如果您的应用程序不使用线程,我将使用比
向量更快的方法

Vector
是JDK1.0的一部分<代码>数组列表
未找到。我们了解到,默认情况下,同步意味着性能差,因此,当Java Collections API出现时,情况正好相反

您仍然可以选择使用
java.util.Collections
中的方法同步任何需要同步的集合,但这是您的选择

您还应该了解属于
java.util.concurrent
包的集合。同时访问收藏当然需要仔细设计。

历史

Vector
是JDK1.0的一部分<代码>数组列表
未找到。我们了解到,默认情况下,同步意味着性能差,因此,当Java Collections API出现时,情况正好相反

您仍然可以选择使用
java.util.Collections
中的方法同步任何需要同步的集合,但这是您的选择


您还应该了解属于
java.util.concurrent
包的集合。同时访问集合当然需要仔细设计。

考虑这个示例,它表明您仍然需要在应用程序代码中使用同步

// BROKEN CODE, needs external synchronization
 // only add an element if the vector is empty
 if(vector.isEmpty())
     vector.add(anElement);
为什么是向量?这取决于你在做什么


在内部,ArrayList和Vector都使用数组保存其内容。在程序中使用这两种方法时,需要记住这一点。在ArrayList或Vector中插入元素时,如果对象空间不足,则需要展开其内部数组。向量默认将其数组大小加倍,而ArrayList将其数组大小增加50%。根据您使用这些类的方式,您可能会在添加新元素时受到很大的性能影响。最好将对象的初始容量设置为程序所需的最大容量。通过仔细设置容量,您可以避免支付稍后调整内部阵列大小所需的费用。如果您不知道将有多少数据,但知道数据的增长速度,Vector确实有一点优势,因为您可以设置增量值。

考虑这个示例,它表明您仍然需要在应用程序代码中使用同步

// BROKEN CODE, needs external synchronization
 // only add an element if the vector is empty
 if(vector.isEmpty())
     vector.add(anElement);
为什么是向量?这取决于你在做什么


在内部,ArrayList和Vector都使用数组保存其内容。在程序中使用这两种方法时,需要记住这一点。在ArrayList或Vector中插入元素时,如果对象空间不足,则需要展开其内部数组。向量默认将其数组大小加倍,而ArrayList将其数组大小增加50%。根据您使用这些类的方式,您可能会在添加新元素时受到很大的性能影响。最好将对象的初始容量设置为程序所需的最大容量。通过仔细设置容量,您可以避免支付稍后调整内部阵列大小所需的费用。如果你不知道你将拥有多少数据,但你知道它的增长速度,Vector确实有一点优势,因为你可以设置增量值。

使Vector同步正是编写Java库的人决定实现它的方式。ArrayList和Vector都是作为数组在内部实现的,它们都是动态调整大小的,但Vector的容量增量是当前数组大小的两倍,而ArrayList的容量增量是当前大小的一半。Vector的速度较慢,因为您必须在其他线程访问它之前检查是否有其他线程正在访问它


如果您需要一个同步列表数据结构,最好使用
synchronizedList(List List)
中的使向量同步正是编写Java库的人决定实现它的方式。ArrayList和Vector都是作为数组在内部实现的,它们都是动态调整大小的,但Vector的容量增量是当前数组大小的两倍,而ArrayList的容量增量是当前大小的一半。Vector的速度较慢,因为您必须在其他线程访问它之前检查是否有其他线程正在访问它

如果需要同步列表数据结构,最好使用

但我的重点是,向量会给我什么

这是一个“遗留”类

除非您特别需要一个同步列表类,
Vector
在编写新代码时不会提供任何信息

然而,
Vector
存在(仍然)是有充分理由的。这个理由是为了让你