This is a real beginner question (I’m still learning the Java basics).
I can (sort of) understand why methods would return a List<String> rather than an ArrayList<String>, or why they would accept a List parameter rather than an ArrayList. If it makes no difference to the method (i.e., if no special methods from ArrayList are required), this would make the method more flexible, and easier to use for callers. The same thing goes for other collection types, like Set or Map.
What I don’t understand: it appears to be common practice to create local variables like this:
List<String> list = new ArrayList<String>();
While this form is less frequent:
ArrayList<String> list = new ArrayList<String>();
What’s the advantage here?
All I can see is a minor disadvantage: a separate “import” line for java.util.List has to be added. Technically, “import java.util.*” could be used, but I don’t see that very often either, probably because the “import” lines are added automatically by some IDE.
When you read
you get the idea that all you care about is being a
List<String>and you put less emphasis on the actual implementation. Also, you restrict yourself to members declared byList<String>and not the particular implementation. You don’t care if your data is stored in a linear array or some fancy data structure, as long as it looks like aList<String>.On the other hand, reading the second line gives you the idea that the code cares about the variable being
ArrayList<String>. By writing this, you are implicitly saying (to future readers) that you shouldn’t blindly change actual object type because the rest of the code relies on the fact that it is really anArrayList<String>.