Vector or ArrayList -- which is better? - JavaWorld
VectororArrayList-- which is better and why?
Sometimes
Vectoris better; sometimesArrayListis better; sometimes you don't want to use either. I hope you weren't looking for an easy answer because the answer depends
upon what you are doing. There are four factors to consider:
- API
- Synchronization
- Data growth
- Usage patterns
Let's explore each in turn.
API
In The Java Programming Language (Addison-Wesley, June 2000) Ken Arnold, James Gosling, and David Holmes describe the
Vectoras an analog to theArrayList. So, from an API perspective, the two classes are very similar. However, there are still some major differences between the
two classes.Synchronization
Vectorsare synchronized. Any method that touches theVector's contents is thread safe.ArrayList, on the other hand, is unsynchronized, making them, therefore, not thread safe. With that difference in mind, using synchronization
will incur a performance hit. So if you don't need a thread-safe collection, use theArrayList. Why pay the price of synchronization unnecessarily?Data growth
Internally, both the
ArrayListandVectorhold onto their contents using anArray. You need to keep this fact in mind while using either in your programs. When you insert an element into anArrayListor aVector, the object will need to expand its internal array if it runs out of room. AVectordefaults to doubling the size of its array, while theArrayListincreases its array size by 50 percent. Depending on how you use these classes, you could end up taking a large performance
hit while adding new elements. It's always best to set the object's initial capacity to the largest capacity that your program
will need. By carefully setting the capacity, you can avoid paying the penalty needed to resize the internal array later.
If you don't know how much data you'll have, but you do know the rate at which it grows,Vectordoes possess a slight advantage since you can set the increment value.Usage patterns
Both the
ArrayListandVectorare good for retrieving elements from a specific position in the container or for adding and removing elements from the end
of the container. All of these operations can be performed in constant time -- O(1). However, adding and removing elements from any other position proves more expensive -- linear to be exact: O(n-i), where n is the number of elements and i is the index of the element added or removed. These operations are more expensive because you have to shift all elements
at index i and higher over by one element. So what does this all mean?It means that if you want to index elements or add and remove elements at the end of the array, use either a
Vectoror anArrayList. If you want to do anything else to the contents, go find yourself another container class. For example, theLinkedListcan add or remove an element at any position in constant time -- O(1). However, indexing an element is a bit slower -- O(i) where i is the index of the element. Traversing anArrayListis also easier since you can simply use an index instead of having to create an iterator. TheLinkedListalso creates an internal object for each element inserted. So you have to be aware of the extra garbage being created.
浙公网安备 33010602011771号