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