Let's say you write a thousand lines of code related that that "xy", including lots of small methods that get passed "xy" as a parameter -- i.e., they accept an ArrayList.
Now imagine that one day, you do some profiling and realize that your application spends a lot of time inserting elements into the middle of "xy", and a LinkedList would be more efficient. How many lines of code would you have to change? Answer: maybe a lot. I don't know. You'd have to search.
Now, answer that again using "x". The answer is "one". That's good, yes?
This is even more important if those methods are in a library called by other people's code. Using an interface instead of a concrete class gives those people the flexibility to use whatever implementation is best for them.
Upcasting to the interface type "List" is preferred because it makes your code more flexible. Specifically, you can treat the object as a List in other code -- for example, passing it to a method that takes a List reference as an argument. This gives you the option of changing the runtime type later to some other List -- for example, if you decide that a LinkedList might be more appropriate -- and this won't break your other code because the object is still a "List."
"We're kind of on the level of crossword puzzle writers... And no one ever goes to them and gives them an award." ~Joe Strummer sscce.org