No caso de listas, sets e maps, é bastante vantajoso declara-las através da interface. Primeiro, por que a interface contém todos os métodos das classes concretas. Elas pouco somam em termos de funcionalidade. Depois, pq se os métodos que chamam seus métodos dependerem só da interface, seus métodos poderão mudar de implementação livremente.
Por exemplo, alguém que use o seu método listaUltimasNamoradasDoAndreAS(), vai ter que declarar um arraylist:
ArrayList<String> namoradas = listaUltimasNamoradasDoAndreAS();
...
E isso provavelmente irá acontecer em vários trechos do código. Agora, qual seria a dificuldade, caso você decidisse que o método listaUltimasNamoradasDoAndreAS() deveria retornar uma LinkedList e não uma ArrayList? Você teria que sair alterando todos os locais que chamam o método listaUltimasNamoradasDoAndreAS().
Agora, se você tivesse declarado assim:
public static List<String> listaUltimasNamoradasDoAndreAS(){
List<String> lista = new ArrayList<String>();
lista.add("Paula");
lista.add("Béte");
lista.add("Aline");
System.out.println(lista);
return lista;
}
Agora, os métodos que usam o listaUltimasNamoradasDoAndreAS() o fazem assim:
List<String> namoradas = listaUltimasNamoradasDoAndreAS();
Note que caso você resolva alterar dentro do método de ArrayList para LinkedList, a linha acima não sofre nenhuma modificação.
Se ainda não entendeu, dá uma lida nesse exemplo: http://www.guj.com.br/posts/list/55387.java#290673