Vi em um tutorial a seguinte implementação que vejo em muitos outros códigos também:
List<String> palavras = new ArrayList<String>();
Notei que fazer List<String> palavras = new List();
é impossível porque "List" é uma interface. (Causa erro de compilação).
ArrayList<String> palavras = new ArrayList();
não causa nenhum erro. Então porquê utilizar List<String> palavras = new ArrayList<String>();
?
Analisando as estruturas, parece ter uma hierarquia, "ArrayList" extende "AbstractList" que extende "AbstractCollection" que implementa "List". Só que apenas isso não me parece motivo suficiente.