Tuesday, September 6, 2011

ArrayList and Vectorare two of most used class on java collection package and difference between Vector and ArrayListis one of the most frequently asked java interview question on first round or phone interview. Though it’s quite a simple question in my opinion but knowledge of when to use Vector over ArrayList or does matter if you are working on a project. In this article we will some point based difference betweenVector and ArrayList in Java and trying to understand the concept behind those differences. Ultimate goal is to familiarize yourself with distinguish property of ArrayList and Vector. By the way Java 5 adds another implementation of List interface which is similar to Vector and ArrayList but provides better concurrency access than Vector, its called CopyOnWriteArrayList. By the way this is the third article on discussing about Collection interview question, Difference between LinkedList and ArrayList and List vs Set are other popular interview questions based upon collection framework in Java.

Before seeing differences between Vector and ArrayList, let's see some similarities between these two and why we can use ArrayList in place of Vector on certain scenario.

1) Vector and ArrayListare index based and backed up by an array internally.

2) Both ArrayList and Vector maintains the insertion order of element. Means you can assume that you will get the object in the order you have inserted if you iterate over ArrayList or Vector.

3) Both Iterator and ListIterator returned by ArrayList and Vector are fail-fast.

4) ArrayList and Vector also allows null and duplicates.

Vector vs ArrayList in Java

Now let's see some key difference between Vector and ArrayList in Java, this will decide when is the right time to use Vector over ArrayList and vice-versa. Differences are based upon properties like synchronization, thread safety, speed, performance , navigation and Iteration over List etc.

1) Synchronization and thread-safety

First and foremost difference between Vector and ArrayList is that Vector is synchronized and ArrayList is not, what it means is that all the method which structurally modifies Vector e.g. add () or remove () are synchronized which makes it thread-safe and allows it to be used safely in a multi-threaded and concurrent environment. On the other hand ArrayList methods are not synchronized thus not suitable for use in multi-threaded environment. This is also a popular interview question on thread, where people ask why ArrayList can not be shared between multiple threads.

2) Speed and Performance

ArrayList is way faster than Vector. Since Vector is synchronized and thread-safe it pays price of synchronization which makes it little slow. On the other hand ArrayList is not synchronized and fast which makes it obvious choice in a single-threaded access environment. You can also use ArrayList in a multi-threaded environment if multiple threads are only reading values from ArrayList or you can create read only ArrayList as well.

3) Capacity

Whenever Vector crossed the threshold specified it increases itself by value specified in capacityIncrement field while you can increase size of ArrayList by calling ensureCapacity () method.

4) Enumeration and Iterator

Vector can return enumeration of items it hold by calling elements () method which is not fail-fast as opposed to Iterator and ListIterator returned by ArrayList. I have discussed this point in detail on my post What is difference between Iterator and Enumeration, you can also look there.

5) Legacy

Another point worth to remember is Vector is one of those classes which comes with JDK 1.0 and initially not part of Collection framework but in later version it's been re-factored to implement List interface so that it could become part of collection framework

After considering these points about both Vector and ArrayList , my conclusion is use ArrayList wherever possible and avoids use of Vector until you have no choice. Think for CopyOnWriteArrayList over Vector, if you have multiple readers and few writers because it can provide thread-safety without impacting performance too much.

6 comments
:

Anonymous
said...

Hi Javin,I have been visiting your blog for the past couple of weeks and has found it really nice. Though there are multiple such blogs the good thing about your blog seems to be that you have been regular in your posts and have followers who actively discuss things in the comments. Congrats on that :) Just an advice is that with in some posts the content seems to have got repeated. It could have been more concise and crisp without redundant info.

And I have a doubt regarding the point 5 mentioned in the above post:>>ArrayList in Java has no default size but Vector in Java has default size of 10.<<But I believe even ArrayList has a default size of 10. The javadoc says>> ArrayList() Constructs an empty list with an initial capacity of ten.<<Hope you will check on this and verify it.

Thanks Lokesh for your valuable content, yes you are correct about point 5.Indeed javadoc of ArrayList says "Constructs an empty list with an initial capacity of ten." and I will correct that. Once again thanks for pointing this out and your kind advice. appreciate.

If you compare Vector vs ArrayList or Vector vs HashSet you will find ArrayList and HashSet are way faster than Vector and given we have Concurrent List implementation like CopyOnWriteArrayList, there is no need to use Vector.Only significant difference between Vector and ArrayList is synchronization or locking otherwise they are same.