Set, HashSet e TreeSet - Dúvidas

por favor, qual a diferença do HashSet pro TreeSet? aliás se eu troco o Set por HashSet funciona, veja abaixo:

mas o HashSet não deveria implementar a interface Set?

ex:

/** * Método listaNomes. Elementos repetidos não repetem. * @return lista * */ public static Collection<String> listaSobrenomes(){ HashSet<String> lista = new HashSet<String>(); lista.add("Santos"); lista.add("Santos"); lista.add("Asantos"); System.out.println(lista); return lista; }

[quote=andredecotia]por favor, qual a diferença do HashSet pro TreeSet? aliás se eu troco o Set por HashSet funciona, veja abaixo:

mas o HashSet não deveria implementar a interface Set?

ex:

/** * Método listaNomes. Elementos repetidos não repetem. * @return lista * */ public static Collection<String> listaSobrenomes(){ HashSet<String> lista = new HashSet<String>(); lista.add("Santos"); lista.add("Santos"); lista.add("Asantos"); System.out.println(lista); return lista; }[/quote]

Assim, vc ta usando de polimorfismo:

Set<String> lista = new HashSet<String>();

Assim não:

HashSet<String> lista = new HashSet<String>();

Diferença entre HashSet e TreeSet:

TreeSet é classificada, ou seja sua propria lista tenta ordenar seus objetos de uma forma natural ou não.

HashSet, não é classificada nem ordenada, veja que ao adicionar seus elementos, não tem como vc saber onde esta um determinado item.

Oi evertonsilvagomesjava, como vai?

Brother, pelo q entendí então, é questão de estar ou não usando Polimorfismo, pois o resultado seria o mesmo, certo? Veja meu outro exemplo:

/** * Método listaUltimasNamoradasDoAndreAS. * @return lista * */ public static ArrayList<String> listaUltimasNamoradasDoAndreAS(){ List<String> lista = new ArrayList<String>(); lista.add("Paula"); lista.add("Béte"); lista.add("Aline"); System.out.println(lista); return (ArrayList<String>) lista; }

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

SImples.
Set é uma interface, implementada tanto por HashSet quanto por TreeSet, entre outros.
Assim como List é uma interface que é implementada por ArrayList, Vector, LinkedList, etc

A diferença é que TreeSet implementa, na verdade, SortedSet, que por fim extende Set.

Sugiro um bom estudo sobre a API Collections antes de prosseguir. Procure pela árvore de interfaces e implementações de Collections, o taborda postou um muito bom por aqui em algum lugar. Procure.