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 : java, Programação avançada
0 thoughts on “Java, exercício de análise”