Generally the second one is preferred.
You can use the object according to the List interface, and if you once happen to decide to use a LinkedList instead of the ArrayList, you can switch it without much rewriting.
Ishan Pandya wrote:Polymorphism is the difference.
Actually, it isn't - except in the general sense that any interface method is called polymorphically.
@Nigel: The reason that, as Ivan says, the 2nd method is better is that it doesn't tie your program to a specific implementation. When you're designing something, you don't say "I want an ArrayList of things" (at least you shouldn't), you say "I want a List of things" - and the 2nd declaration does exactly that.