Question

Is there a difference between these two? If so, what is it?

List<Integer> x = new ArrayList<Integer>();

and

ArrayList<Integer> x = new ArrayList<Integer>();
Was it helpful?

Solution

The first declaration lets you program to interface. It ensures that later on you can safely replace ArrayList with, say, LinkedList, and the rest of code is going to compile.

The second declaration lets you program to the class, so you could potentially use methods of ArrayList which do not implement the List interface. For example, you can call ensureCapacity() on the list declared as ArrayList, but not on a list declared as List. Although generally programming to interface should be preferred, there is nothing wrong with doing it if you must call class-specific methods: for example, ability to call ensureCapacity() could save some unnecessary reallocations if you know the new target size of your list.

OTHER TIPS

The former is preferred. It allows changing the implementation without changing code that depends on the field.

In Effective Java, Joshua Bloch says:

If appropriate interface types exist, then parameters, return values, variables and fields should all be declared using interface types.

...

If you get into the habit of using interfaces as types, your program will be much more flexible.

If you code to interfaces then you can change the implementation without much hassle

List<Integer> x = new ArrayList<Integer>();

you can make x now point to a LinkedList or any other implementation of List with only one line of code. If you need a specific method that is in ArrayList then having ArrayList on the left hand side is perfectly acceptable. 99 times out of 100 thought you wont so List is preferred

With ArrayList you can specify an intitalsize and so ArrayList has trimToSize() method to trim its size to the current size.With List<Integer> you won't be able to trim the size unless you cast it back to ArrayList

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top