Your second question is a frequently asked question on the forums here. Look at the following example:
The good thing about the first version is that the rest of the application that uses the list does not need to know what kind of list exactly it is - the only thing that's important is that it is a list. Because of this, you could easily change the exact type of the list if you later find out that that would be more efficient, for example:
For the rest of the application, names is still a List<String>, so you would not have to change anything in the rest of the application.