重要: 使用HashMap时候, 作为key类, 必须合理重写hashCode() 和 equals, 否则会引用HashMap各种故障!!!
package day05;
public class Point {
private int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public boolean equals(Object obj) {
if(obj==null) return false;
if(obj==this) return true;
if (obj instanceof Point) {
Point other = (Point) obj;
return x==other.x && other.y==y;
}
return false;
}
public int hashCode(){
return x*1000+y;
}
public String toString() {
return "("+x+","+y+")";
}
}
@Test
public void testHashMap2(){
/*
* 测试使用Point作为Map的key
* Point已经合理的实现了hashCode和equals方法
* 此时 HashMap的各种功能都会正常了!!!
*/
Point p1 = new Point(3, 4);
Point p2 = new Point(3, 4);
Point p3 = new Point(4, 3);
Point p4 = new Point(7, 8);
System.out.println(p1.hashCode());//3004
System.out.println(p2.hashCode());//3004
System.out.println(p3.hashCode());//4003
System.out.println(p4.hashCode());//7008
System.out.println(p1.equals(p2));//true
System.out.println(p1.equals(p3));//false
System.out.println(p1.equals(p4));//false
Map<Point, String> map =
new HashMap<Point, String>();
map.put(p1, "p1");
map.put(p2, "p2");
map.put(p3, "p3");
map.put(p4, "p4");
//这个结果说明: p1和p2作为相同的key
// 不能重复添加到map, 此时工作正常!!!
System.out.println(map);//{(3,4)=p2, (7,8)=p4, (4,3)=p3}
//p1.x = 8;
map.put(p1, "p1");
System.out.println(map);//{(3,4)=p1, (7,8)=p4, (4,3)=p3}
System.out.println(map.get(p2));//p1
}