首先我应该说,在我的书(2005)中,Vector<E>
(广泛使用)代替数组。与此同时,没有任何解释,两者之间存在差异。检查Vector
类Oracle Doc,可以很容易地理解它的用法。
对StackOverflow和Google进行了一些额外的研究,我发现Vector
类实际上已被弃用,而使用ArrayList
代替这是正确的吗? {{3} }
我无法理解的部分:我应该使用ArrayList
而不是简单数组的规则?似乎我应该始终使用{{1} }。它看起来更有效,并且应该更容易实现值/对象的集合,这种方法是否有任何不利之处?
答案 0 :(得分:4)
一些历史:
Vector
自Java 1.0以来就存在; List
; ArrayList
已经过改造,可以同时实施Vector
界面; 你的课程,可以追溯到2005年,应该在列表中知道List
(对不起,至少),并且也应该引入泛型。
对于ArrayList
,有Array
,它有助于对数组的反射(即java.lang.reflect.Array
等)。
基本上:
int[]
同步所有操作,这在90%以上的情况下都是浪费; Vector
,ConcurrentHashMap
等,你应该使用它们; CopyOnWriteArrayList
; JDK中的一些代码仍然使用它,但它是出于向后兼容的原因。在新的代码中,有更好的替代方案,如前一点所述; Vector
无法提供与之前提供的相同的线程安全保证。后一点很有意思。 Vector
之前有Iterator
,而Enumeration
没有提供删除元素的可能性;但是,Enumeration
确实如此。
因此,让我们采用两个线程Iterator
和t1
,一个t2
,以及那两个线程在该向量上有Vector
。线程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
实际上不线程安全。自Java 5引入“foreach循环”以来,它的线程安全性更低,它创建了一个“隐藏”的迭代器。
答案 1 :(得分:3)
array
和ArrayList
之间的基本区别在于数组具有固定大小,而ArrayList
可以根据需要动态增大。因此,如果您确信您的阵列大小不会改变,那么您可以使用它。但是如果你想稍后添加元素,那么ArrayList
是一个List
接口的实现,是可行的方法。
虽然ArrayList
仅由array
内部支持。因此,在内部它也使用固定大小的数组,初始容量 10 (可以改变),但该细节在内部隐藏。因此,您不必担心ArrayList
的大小变化。
每当您在ArrayList
中添加超过当前数组大小的元素时,内部数组都会被扩展。这意味着,如果您经常插入大量元素,则规则扩展可能会成为开销。虽然这种情况很少发生。不过,您还可以在创建ArrayList
时提供自己的初始尺寸。所以,由你来决定。
关于Vector
vs ArrayList
讨论,是Vector
现在已被弃用(但不是技术上的,但不鼓励使用@Luiggi的评论中所述),您应该使用ArrayList
。区别在于Vector
同步每个操作,这几乎不需要。需要同步时,始终可以使用Collections.synchronizedList
创建同步列表。
有关此讨论的更多信息,请参阅this post。
ArrayList
是List
的实现。还有其他变化。就像你还有一个LinkedList
一样,可以获得传统链接列表的功能。
答案 2 :(得分:0)
实际上不推荐使用Vector类,而是使用ArrayList,这是正确的吗?
是的,这是正确的。不推荐使用Vector类和其他一些集合,并替换为ArrayList,Map等新集合。以下是few为什么不推荐使用Vector的原因
我应该使用ArrayList而不是简单的数组吗?
几乎总是如此。我可以想到你应该使用数组的两个原因:
另一方面,使用ArrayList提供了很多优点。添加新元素时,不需要考虑控制数组的大小,可以使用ArrayList的简单API来添加/删除集合中的元素等。
答案 3 :(得分:0)
我只想加两分钱。
如果您需要原始数据和优化问题的集合,数组总是更快,因为它消除了自动装箱和自动拆箱的要求。