Java, exercício de análise

assunto: equals, hashcode e colecções
pergunta: qual o output do seguinte:

package recursopa2;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

class Aluno{
    private String nome;
    private int codigo;

    public Aluno(String nome, int codigo){
        this.nome = nome;
        this.codigo = codigo;
    }

    public boolean equals(Object ob){
        if(!(ob instanceof Aluno)) return false;
        //o equals só exige que tenham o mesmo nome
        return nome.equals(((Aluno)ob).nome);// (Aluno) é um cast importante, por ser Object
    }
    
    public int hashCode(){
        //vai retornar o código do aluno
        return this.codigo;
    }   
}
//o equals e o hashCode estão mal feitos/compativeis (não está bem planeado)
//eles deviam ser compativeis, pois cada um pergunta por uma coisa diferente
//o hashCode devia retornar  os mesmo ou um sub conjunto dos membros do equals

class main{
     public static void main(String[] args) {

        Set<Aluno> conjunto = new HashSet<>(); 
        //HashSet (se são iguais) se:
        //para ver se está contido, uso o equals e o hashCode
        //se o hashCode for diferente acabou
        //se o hashCode for igual vai ver se o equals diz que sim ou que não
        //HashSet, não deixa acrescentar elementos que ele ache que já tem
        //não permite/recusa assim repetições
        
        Map<Aluno,Integer> mapa = new HashMap<>();
        //HashMap
        //não deixa que existam chaves iguais 
        //(compara a chave do map, primeiro testa o hashcode depois o equals)
        //vai verificar se existe alguma chave igual, se o hashCode é o mesmo
        //se for só deixa entrar alterando o valor da chave que está a ser usada
        
        List<Aluno> lista = new ArrayList<>();
        //ArrayList
        //acrescenta tudo o que lhe dado, e considera que contém
        //e só usa o equals para verificar, mas deixa sempre acrescentar
        
        conjunto.add(new Aluno("aaa", 2)); //fica, é o primeiro
        conjunto.add(new Aluno("aaa", 2)); //não fica, tem o mesmo nome, usado o equals
        conjunto.add(new Aluno("aaa", 4)); //fica, não existe nenhum com o mesmo  hashCode
        conjunto.add(new Aluno("bbb", 2)); //hashCode igual, vamos ver o equals se dá igual, fica

        mapa.put(new Aluno("aaa", 2),1); //fica é o primeiro, mas depois saiu
        mapa.put(new Aluno("aaa", 2),1); //fica, é igual, mas sai o primeiro
        mapa.put(new Aluno("aaa", 4),1); //fica, a chave/hashCode é diferente: "aaa", 4, nem sequer usa o equals
        mapa.put(new Aluno("bbb", 2),1); //o hashCode é igual, mas usa o equals que é diferente, fica

        lista.add(new Aluno("aaa", 2)); //fica é i primeiro
        lista.add(new Aluno("aaa", 2)); //fica, mesmo que sejam iguais, aceita sempre 
        lista.add(new Aluno("aaa", 4)); //fica 
        lista.add(new Aluno("bbb", 2)); //fica
        
        System.out.print(conjunto.size() + " "); // 3
        System.out.print(mapa.size() + " "); // 3
        System.out.println(lista.size()); //4

        Aluno a = new Aluno("bbb", 3); 
        System.out.print(conjunto.contains(a) + " "); 
        //perguntar se o conjunto tem o "bbb", 3
        //o conjunto tem o "bbb" mas não tem o código 3
        //assim o cojunto vai ver primeiro o hashCode, é diferente
        //logo não contem, logo a resposta dá false
        
        System.out.print((mapa.get(a) != null) + " "); 
        //o mapa.get(a), tem lá um "bbb" com código 2
        //mas o a tem código 3
        //não existe nenhum hashcode 3, , resposta dá false
        
        System.out.println(lista.contains(a));   
        //a lista só vai ver o equals
        //o equals neste caso só compara o nome
        //, e a resposta dá true
     }
} 
Tags : ,

0 thoughts on “Java, exercício de análise”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.