Sejam bem vindos, esta e a decima segunda aula de Programacao Web em Java.O conteudo de Java esta no final, logo iremos comecar nossa primeira aplicacao Web com JSP.Hoje iremos aprender alguns conceitos e tecnicas para trabalhar com colecoes.Decima Segunda Aula: Colecoes, Hashing e Comparadores.HashingHashing e uma maneira de identificar objetos com um numero inteiro. Coisas iguais tem (ou deveriam ter) o mesmo numero hash. Isso e extremamente util para realizacao de comparacoes mais rapidas.Em classes escritas por voce mesmo, para isso funcionar corretamente, voce deve sobrescrever a funcao .hashCode() e gerar seu proprio numero hash.A funcao .HashCode()Esta funcao deve retornar um numero inteiro. E definida na classe java.lang.Object e retorna altomaticamente um valor unico para cada instancia (para cada objeto).Se sua classe tem comportamento diferente deste, voce deve sobrescrever esta funcao.As tres premissas da funcao .HashCode() sao:O hashCode de um objeto nao deve mudar se o valor de um objeto nao mudar.Dois objetos iguais DEVEM ter o mesmo hashCodeE desejavel que dois objetos diferentes tenham hashCode distintos (sempre que isso for possivel)Exemplos de hashCode:String scott = "Scotty";String scott2 = "Scotty";String corey = "Corey";System.out.println(scott.hashCode());System.out.println(scott2.hashCode());System.out.println(corey.hashCode()); // => -1823897190, -1823897190, 65295514Integer int1 = 123456789;Integer int2 = 123456789;System.out.println(int1.hashCode());System.out.println(int2.hashCode()); // => 123456789, 123456789Classe NomeCompletoPara prosseguir iremos definir uma classe chamada NomeCompleto, que sera utilizada nos exemplos do restante da aula:public class NomeCompleto { public String nome; public String sobrenome; public NomeCompleto(String nome, String sobrenome) { this.nome = nome; this.sobrenome = sobrenome; } public String toString() { return nome + " " + sobrenome; } public boolean equals(Object o) { return (o instanceof NomeCompleto &&((NomeCompleto) o).nome.equals(this.nome) &&((NomeCompleto) o).sobrenome.equals(this.sobrenome)); }}Vamos verificar se esta classe NomeCompleto esta funcionando corretamente:NomeCompleto maria = new NomeCompleto("Maria", "Lucia");NomeCompleto jose = new NomeCompleto("Jose", "Silva");NomeCompleto jose2 = new NomeCompleto("Jose", "Silva");System.out.println(maria.equals(jose));System.out.println(jose.equals(jose2));System.out.println(maria.hashCode());System.out.println(jose.hashCode());System.out.println(jose2.hashCode()); // false, true, 6718604, 7122755, 14718739Objetos sao iguais, mas o hashCode nao e. Precisamos arrumar esta classe.Voce nao pretende usar a classe hashCode, portanto nao precisa se preocupar com isso nao e? ERRADO! Voce precisa resolver isso porque ira ter problemas com listas e colecoes. As classes que implementam as listas pressupoem que a funcao hashCode() funciona corretamente.Alias, estamos vendo hashCode no inicio desta aula, justamente para podermos usar listas na continuacao, e lembra-lo que antes de usar listas deve sobrescrever esta funcao.O que deve fazer a funcao hashCode mesmo? Gerar um numero inteiro unico para objetos com conteudo iguais, e diferentes para objetos de conteudo diferente.Possivel implementacao para o nosso exemplo:public class NomeCompleto { ... public int hashCode() { return nome.hashCode() *23 + sobrenome.hashCode(); }}Veja que as classes String ja implementam hashCode corretamente. Usamos *23 para que Jose Maria seja diferente de Maria Jose. Faca testes e verifique que sem a multiplicacao o hashCode gerado e o mesmo.Tenha certeza que entendeu este topico antes de prosseguir. Funcoes hashCode nao implementadas ou com codigo errado irao provocar problemas estranhos no uso de colecoes. Estes problemas poderao te deixar realmente confuso. Se tiver duvidas nesta parte pergunte nos comentarios antes de continuar.ColecoesColecoes sao implementacoes da biblioteca java para executar:Colecoes de objetosOrdenacao de objetosEstocagem de objetosRecuperacao e busca de objetos estocadosPara usar Colecoes deve-se incluir a importacao