Interface vs Classe - [Resolvido]

Bom dia a todos.

Desculpe se não fui claro no tópico, mas tentarei ser o mais claro e objetivo na minha dúvida.
Eu tenho por costume, ao utilizar determinadas classes, de usar a interface e instanciar uma determinada classe que a implemente.

Exemplos:

List<String> stringList = new ArrayList<String>(); Map<Integer, String> mapList = new HashMap<Integer, String>();

Bom, foram apenas dois exemplos. Para os mesmos, gostaria de saber se existe diferença técnica, de desempenho, qualidade de código, enfim, para o código abaixo:

ArrayList<String> stringList = new ArrayList<String>(); HashMap<Integer, String> mapList = new HashMap<Integer, String>();

Veja, aqui declaro a própria classe e não sua respectiva interface.
É isso, espero ter sido claro.

Edit: eu sei que você pode implementar uma interface e adicionar mais métodos a classe que implementa a interface, por exemplo. Sobre isso estou bem esclarecido.

Grato a todos.
Abraços.

tratando-se de qualidade de código você terá benefícios do uso de polimorfismo.

http://www.argonavis.com.br/cursos/java/j100/java_10.pdf

[quote=aeciovc]tratando-se de qualidade de código você terá benefícios do uso de polimorfismo.

http://www.argonavis.com.br/cursos/java/j100/java_10.pdf[/quote]

Oi!

Grato pela resposta.
Em outras palavras, o modo como utilizo (interface = instancia de uma determinada implementação) seria o mais adequado que o segundo exemplo (classe - classe) ?

Abraços.

É o mais adequado sim, pois reduz o acoplamento. Todo seu código fica dependente da funcionalidade (List) e não da implementação específica (ArrayList/LinkedList).
Leia esse tópico, onde explico detalhadamente o porque:

Existem ainda outras “mágicas” que vc pode fazer com interfaces.

Por exemplo:

a) Criar uma versão modificada da sua coleção:

List<String> listaImodificavel = Collections.unmodifiableList(lista);

b) Criar uma versão sincronizada da lista:

List<String> listaImodificavel = Collections.synchronizedList(lista);

Esses dois caras são implementados através do padrão de projeto proxy.

É o uso de interfaces assim que também torna possível a implementação efetiva de padrões como o Decorator:

No fundo, eles retornam outras classes, que simplesmente fazem chamadas a sua lista de verdade, adicionando uma pequena funcionalidade, ou restringindo acesso.

Perfeito Viny.

Eu estou no caminho correto então. Fui questionado sobre isso mas não dei uma resposta convicente, como sei que o GUJ possui pessoas com mais experiência, resolvi postar e trocar uma idéia.

Tenho uma grande preocupação em utilizar ao máximo OO e usufruir da melhor forma possível do que o Java oferece, por isso o questionamento.
Creio que isso virá ao longo dos anos, não cheguei a completar 3 anos ainda no Java, portanto, digo que estou apenas engatinhando nessa longa estrada.

De qualquer forma, muito obrigado pela explicação!
Abraços!