Difference between a List and ArrayList Reference Variable in Java?

Someone who is just starting with Java programming language often has doubt about how we are storing an ArrayList object in List variable, what is the difference between List and ArrayList? or why not just store the ArrayList object in ArrayList variable just like we do for String, int, and other data types. Well, the main difference between List and ArrayList is that List is an interface while ArrayList is a class. Most importantly, it implements the List interface, which also means that ArrayList is a subtype of List interface. In Java or any object oriented language, super type of variable can store an object of subtype. This is known as Polymorphism because any virtual method will be executed from subclass only, even though they were called from super type. This is the beginning, now let's see those two questions as well.

Why store ArrayList object on List variable?

You might have seen something like this:

List<Movie> listOfMovies = new ArrayList<Movie>()

here we are using a List as a type of variable to store an object of ArrayList class, created using new() operator. This is known as programming for the interfaces. In fact, everywhere you need to declare a reference variable, you should always use the supertype e.g. Map for passing HashMap, Set for passing HashSet and List for passing ArrayList, LinkedList or Vector. You should use interface as type on the return type of method, type of arguments etc as shown below? Now big question comes, Why should you do that?

The answer is to take advantage of Polymorphism. If you use interface than in future if the new implementation is shipped then you are not required to change your program. For example, any program written using List will work as expected whether you pass a LinkedList, Vector or ArrayList, because they all implements List interface, they obey the contract exposed by List interface.

The only difference comes in performance, which is actually on of the driver for change. In short, if you program using interface, tomorrow if a better implementation of your interface is available then you can switch to that without making nay further change on the client side (part of the program which uses that interface).

Similarly, you should use interface type on method arguments:

public void sort(List<? extends Comparable> input){
       // logic to sort the list  

and use interface type on the return type of methods:

public List<Employee> getEmployees(int departmentId){
       // logic to return employees for a given department

If you store ArrayList's object into a reference type of ArrayList, as shown below then your code will not work if you pass a LinkedList, because ArrayList IS NOT a LinkedList.

public List<Movies> getMovies(LinkedList<String> actors){
       // this code will not work if you pass ArrayList
but following code will work, even if you pass ArrayList, Vector, CopyOnWriteArrayList or LinkedList, because it expects a List, which is an interface:

public List<Movies> getMovies(List<String> actors){
       // this code will work if you pass ArrayList, Vector etc

Your program is pretty much hard coded, it lack the flexibility offered by Polymorphism and Inheritance. This answer is also applicable to questions like difference between Map and HashMap or Set and HashSet because ultimately they are the same question, the difference between interface and their implementation. You must follow SOLID principles to write a better program in object oriented programming languages like Java or C++.


  1. Thanks a lot! I was looking for this answer for a lot of time.
    Best description, but if you add some real life examples then it will be pretty easy to learn and remember.

    1. Thanks for feedback, I think I have given the example here, isn't it clear? could you elaborate more what do you really want?