我试图理解为什么在Java的矢量,必须同步。 只要我通过谷歌达成协议,他们表示,其同步,因为它的元素synchronized块的其他线程,当一个线程访问它访问。 但我真正想知道的是为什么它必须是? Java的应该有它留给谁正在访问它的人。 但是,为什么Java的强迫所有的人访问矢量使用同步数据结构? 我同意的人谁说的ArrayList可用于我的要求。 但我要说的是那是什么向量要给我吗?
感谢和问候,Rengasami Ramanujam
我试图理解为什么在Java的矢量,必须同步。 只要我通过谷歌达成协议,他们表示,其同步,因为它的元素synchronized块的其他线程,当一个线程访问它访问。 但我真正想知道的是为什么它必须是? Java的应该有它留给谁正在访问它的人。 但是,为什么Java的强迫所有的人访问矢量使用同步数据结构? 我同意的人谁说的ArrayList可用于我的要求。 但我要说的是那是什么向量要给我吗?
感谢和问候,Rengasami Ramanujam
历史。
Vector
是JDK 1.0的一部分; ArrayList
不是。 我们了解到,同步为默认意味着性能差,所以当Java集合API出来就被逆转。
您仍然可以选择你需要使用的方法收集任何同步java.util.Collections
,但它是你的选择。
你也应该知道,是一部分的集合java.util.concurrent
包。 馆藏的同时访问肯定需要进行精心编排。
但我要说的是那是什么向量要给我吗?
这是一个“传统”类。
除非特别需要同步的列表类, Vector
给你没事的时候你正在编写新的代码。
但是, Vector
是(仍然)有一个很好的理由。 这个理由是让你跑这是用JAVA写的1.0和Java 1.1中工作,或者对一些不包括Java集合框架的Java ME配置文件来运行老的Java代码。 而且它具有(仍)保持同步,因为如果他们改变了这一切,任何使用多线程的遗留代码Vector
可以打破。
下面这个例子显示,你仍然需要在应用程序代码中使用的同步。
// BROKEN CODE, needs external synchronization
// only add an element if the vector is empty
if(vector.isEmpty())
vector.add(anElement);
为什么矢量? 取决于你在做什么
在内部,无论是ArrayList和Vector守住使用数组的内容。 你需要保持这个事实考虑,而在你的程序中使用两种。 当你插入一个元素ArrayList或载体,对象将需要的,如果它运行的空间来扩大其内部数组。 的矢量默认为加倍其阵列的大小,而该ArrayList 50%增加其阵列尺寸。 这取决于你如何使用这些类,你可能最终会采取一个大的性能损失,同时增加新的元素。 它总是最好设置对象的初始容量,以你的程序将需要最大容量。 通过精心设置的容量,可以省下以后调整内部数组所需要的处罚。 如果你不知道你有多少数据,但你知道它的增长速度,矢量并拥有微弱的优势,因为你可以设置的增值。
你是不是被迫使用Vector
你会比较好用ArrayList
S以及。
如果你使用线程工作,你是高兴,如果它的同步。 如果您的应用程序不使用线程我会用的东西比更快的Vector
。
制作矢量同步的仅仅是谁写的Java库决定实施它的人的方式。 既ArrayList和Vector在内部实现为阵列,都被动态地调整大小,但向量是具有capacityIncrement
双当前数组大小的其中对于ArrayList的是一半的当前大小。 Vector是慢,你必须检查是另一个线程执行之前的任何其他线程访问它。
如果你需要一个同步的列表数据结构,最好使用synchronizedList(List list)
从集合API。
如果你想操作的整个序列同步,使用ArrayList。 同步个体经营者作为载体做,是不太安全。
如果不需要线程安全的操作,建议使用恩的ArrayList。