Dúvida com Map

Fala ae pessoal,

estou com dúvida em um exemplo que vi no livro de certivicação, segue o código:

package teste;

import java.util.HashMap;
import java.util.Map;

public class MapTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Map<Object, Object> m = new HashMap<Object, Object>();
		
		m.put("k1", new Dog("aiko"));
		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());
		
		d1.name = "magnikua";
		System.out.println(m.get(d1));
		
		d1.name = "clover";
		System.out.println(m.get(new Dog("clover")));
		
		d1.name = "arthur";
		System.out.println(m.get(new Dog("clover")));
	}
}

class Dog {
	public Dog(String n) { name = n; }
	public String name;
	public boolean equals(Object o) {
		if((o instanceof Dog) &&
				((Dog)o).name.equals(name)) {
			return true;
		}
		
		return false;
	}
	public int hashCode() { 
		return name.length();
	}
}

class Cat { }

enum Pets { DOG, CAT, HORSE }

porque nos 2 últimos System.out.println o método equals de Dog é chamado e quando eu passo só a referencia d1, não e?

muito obrigado!

Pq a colisão de hashes.

Aliás, seu programa faz uma kgada homérica. Não se deve alterar o hashCode dos objetos que são usados como chave de um HashMap, ou que são elementos de um HashSet. O ideal é usar para as chaves objetos imutáveis.