Interface Map

Bom dia galera… Estou estudando para a certificacao SCJP pelo livro da Kathy e apareceu uma duvida… quando eu faço uma alteracao no codigo. O livro diz que funciona mas pelo que eu executei ele nao funciona… A minha pergunta é: Funciona ou nao…? O codigo e a alteracao esta abaixo… Obrigado…

import java.util.*;
enum Pets {DOG, CAT, HORSE }
class MapTest {

	public static void main(String[] args) {
		Map<Object, Object> m = new HashMap<Object, Object>();
		m.put("K1", new Dog("aiko").name);
		m.put("K2", Pets.DOG);
		m.put(Pets.CAT, "CAT Key");

		Dog d1 = new Dog("Clover");
		m.put(d1, "Dog Key");
		m.put(new Cat(), "Cat Key");

		System.out.println(m.get("K1"));
		String k2 = "K2";
		System.out.println(m.get(k2));
		Pets p = Pets.CAT;
		System.out.println(m.get(p));
		System.out.println(m.get(d1));
		System.out.println(m.get(new Cat()));
		System.out.println(m.size());
                // aqui é a alteracao
		Dog dd = new Dog("Clover");
		System.out.println(m.get(dd));
                System.out.println(m.get(new Dog("Clover")));

	}



}

Como esta no codigo… o livro fala que se eu alterar a instancia do objeto Dog() o Map nao funciona… mas eu executei e funcionou…

                // se eu mudar o livro diz que ele tem 8 chars e no Map são 6 e  que nao funciona
		d1.name = "magnolia";
		System.out.println(m.get(d1));
                

Ele imprimiu o valor do Map…
Estou certo…
OBS: O metodo equals e hasCode da classe Dog esta correto…

Obrigado…

Se for isso mesmo, o livro está errado. Tem certeza que a linha que o livro se refere que o Map não vai achar não é a abaixo?

System.out.println(m.get(new Dog("Clover")));

e como que está o hashCode e o equals?

[quote=#@®®¡$]Se for isso mesmo, o livro está errado. Tem certeza que a linha que o livro se refere que o Map não vai achar não é a abaixo?

System.out.println(m.get(new Dog("Clover")));

Ele diz que se eu alterar o Dog().name para :

d1.name = "mulambo";
System.out.println(m.get(d1));

ele vai dar erro… mas nao da… e se eu fizer assim…

System.out.println(m.get(new Dog("Clover")));

Ele funciona e retorna : Dog Key…mas nao retorna…

Olha o codigo da Classe Dog();…

import java.util.*;

class Dog {

	public String name;

	Dog(String n) {
		name = n;

	}

	public boolean equals(Object o) {
		if ((o instanceof Dog) && (((Dog)o).name == name)){
			return true;
		} else {
			return false;
		}

	}

	public int hasCode() {

		return name.length();
	}
}

Olá,

Não se compara Strings e outros objetos usando ==. Uma implementação melhor para seu método equals seria a seguinte:

public boolean equals(Object o){
    return o instanceof Dog && ((Dog)o).name.equals(name);
}

A implementação do método hashCode também não é a melhor possível, pois pode retornar o mesmo hashcode para objetos diferentes. Embora isso seja permitido pelo contrato de hashCode, é melhor fazer uma dispersão maior. Como o seu equals depende de name, uma implementação melhor seria a seguinte:

public int hashCode(){
    return name.hashCode();
}

Outra coisa, você está usando o livro em inglês ou português? Se for em inglês, pode dizer a página em que aparece o que você fala? Daí eu dou uma olhada quando chegar em casa e confiro se o livro está correto.

[quote=#@®®¡$]Olá,
Outra coisa, você está usando o livro em inglês ou português? Se for em inglês, pode dizer a página em que aparece o que você fala? Daí eu dou uma olhada quando chegar em casa e confiro se o livro está correto.[/quote]

O meu livro é em portugues… pagina 315…sobre generics e collections…
mas pelo meu codigo deveria retornar o valor ou falso?