关于java中重写equals,hashcode,toString的步骤

关于java中重写equals,hashcode,toString的方法
昨天参加了某欧美500强的笔试题,最后一道编程题目就是这个,其实是很基础的题目,我却没做出来,今天研究了一下,给和我一样对此还有些模糊的朋友分享下:

先写一个Cat类,里面包含了重写的equals,hashcode,toString方法
public class Cat {
int number;
String color;

public Cat(int number,String color) {
this.number = number;
this.color = color;
}

public boolean equals(Object obj) {
if(this==obj){
return true;
}
if(obj==null){
return false;
}
if(obj instanceof Cat) {
Cat cat = (Cat)obj;
if(cat.color == this.color && cat.number == this.number){
return true;
}
}
return false;
}

public int hashCode() {
return number;
}

public String toString() {
return "number:"+this.number+", color="+this.color;
}
}


再一个main方法类:
public class MainTest {

public static void main(String[] args) {

Cat cat1 = new Cat(1,"red");
Cat cat2 = new Cat(1,"red");
System.out.println(cat1==cat2);
System.out.println(cat1.equals(cat2));

Map map = new HashMap();
System.out.println(cat1);
System.out.println(cat2);
map.put(cat1,"hello");
map.put(cat2, "hello");
System.out.println(map.size());
}


}
解析:
1.equals方法默认是比较两个对象的引用地址的,cat1和cat2是在内存中分配了两个不同的空间,如果不重写equals方法,那么cat1和cat2两个对象的引用永远不会相等的;
2.以前看书常说,重写了equals方法就要重写hashcode方法,当时不太明白,今天翻阅了些资料,原来一些集合类,如hashmap在执行put方法时,会去比较每次push进去的“键”值是否相同,而这个比较就是调用对象的hashcode方法和equals方法,所以如果不重写hashcode方法,那么上述例子,map.size的结果将是2;
3.关于重写toString方法,主要是用在打印对象时,因为打印时默认打印的是对象的内存地址,你可以重写对象的toString方法,来达到你想要呈现出来的字符串效果。
打印结果是: