O polimorfismo, que significa muitas formas, permite que uma mesma referencia se comporte de formas diferentes. Utilizando corretamente o polimorfismo nos podemos fazer o codigo ficar mais claro, generico e, portanto, reutilizavel.Veja um exemplo: Suponhamos que temos uma superclasse chamada Pessoa:public class Pessoa { public void nome() { }}E que temos duas subclasses com o nome de Estudante e Empregado:public class Estudante extends Pessoa { public void nome() { System.out.println("Nome do estudante: Oberdan"); }}public class Empregado extends Pessoa { public void nome() { System.out.println("Nome do empregado: Taylor"); }}Agora, na nossa classe principal temos o seguinte codigo:/* Perceba que o tipo da variavel e Pessoa , mas nao referencia um objeto do * tipo Pessoa, mas sim um objeto Estudante ou Empregado, essa variavel ref * pode referenciar qualquer objeto que extends a classe Pessoa. */public class ClassePrincipal { public static void main(String[] args) { Pessoa ref = new Estudante(); ref.nome(); // Referencia um objeto da classe Estudante(); ref = new Empregado(); ref.nome(); // Referencia um objeto da classe Empregado(); }}O polimorfismo permite que multiplos objetos de diferentes subclasses sejam tratados como objetos de uma unica superclasse, e que automaticamente sejam selecionados os metodos adequados a serem aplicados a um objeto em particular, baseado na subclasse a que ele pertenca. Quando uma aplicacao precisa manipular uma quantidade grande de dados, ela deve utilizar alguma estrutura de dados. Na biblioteca do Java, ha diversas estruturas de dados que facilitam o trabalho do desenvolvedor.Collection ase da hierarquia. Representa operacoes que sao comuns a todas as colecoes:add() - para adicionar o elemento especificado a colecao.remove() - para remover o elemento especificado da colecao.contains() - para verificar se a colecao contem o elemento especificado.size() - para obter a quantidade de elementos na colecao. Set Nao armazena elementos duplicados. List Mantem a sequencia de insercao. Pode armazenar elementos duplicados. Queue Utilizamos esta interface quando queremos uma colecao do tipo FIFO (Fila).Map Relaciona chaves com valores. Nao armazena chaves duplicadas.A figura apresentada pode ser interpretada da seguinte forma: Um Set, List ou Queue e um tipo de Collection, cada um com suas particularidades. Ja um Map nao e do mesmo tipo dos demais mas tambem manipula colecoes de elementos.SET (HashSet, LinkedHashSet e TreeSet):O uso dessa interface(Set) e quando a ordenacao nao tem prioriade e sim de nao ter duplicatas.HashSet - Nao estabelece nenhuma ordem particular entre os objetos.TreeSet - Utiliza-se de uma arvore Binaria para alinhar os elementos.LinkedHashSet - Mantem a ordem de iteracao dos elementosExemplo:import java.util.Collection;import java.util.HashSet;import java.util.LinkedHashSet;import java.util.TreeSet;public class ExemploSet { public static void main(String[] args) { // Utilizando HashSet Collection c1 = new HashSet(); c1.add("Andre"); c1.add("Carlos"); c1.add("Bruno"); c1.add("Daniel"); c1.add("Daniel"); System.out.println("==== HashSet ===="); for(String str : c1) { System.out.println(str); } // Utilizando TreeSet System.out.println("==== TreeSet ===="); Collection c2 = new TreeSet(c1); for(String str : c2) { System.out.println(str); } // Utilizando LinkedHashSet System.out.println("==== LinkedHashSet ===="); Collection c3 = new LinkedHashSet(c1); for(String str : c3) { System.out.println(str); } }}A saida sera: (Perceba que mesmo tendo inserido 2 vezes o nome "Daniel", ele so aparece uma vez):==== HashSet ====AndreDanielCarlosBruno==== TreeSet ====AndreBrunoCarlosDaniel==== LinkedHashSet ====AndreCarlosBrunoDanielLIST (ArrayList, Vector e LinkedList):Devemos utilizar um List