日期:2014-05-20  浏览次数:20749 次

帮忙分析一下这个基础题

public class Test {
public static void main(String[] args) {
Map<Point , String> map=new HashMap<Point, String>();
Point point=new Point(1);
map.put(point, "第一次");
map.put(point, "第二次");
System.out.println(map);
System.out.println(map.size());
}
}

Point类的代码如下:

public class Point {
private int x;
public Point(int x) {
this.x=x;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
return result;
}
@Override
public boolean equals(Object obj) {
return false;
}
}


我重新了Point的equals方法为return false.
但是在试着保存两个字符串时,却只能保存后面一个。难道不会调用equals方法去比较吗?麻烦知道的朋友分析一下,不胜感激。
java hashmap map

------解决方案--------------------

        map.put(point, "第一次");
        map.put(point, "第二次");

对象做key MAP会覆盖前面的
而且完全一样的对象 那里会掉equals?
------解决方案--------------------
看HashMap get函数里面的代码:
if (e.hash == hash && ((k = e.key) == key 
------解决方案--------------------
 key.equals(k)))
  return e.value;


找到key之后,先看hash是否相等,再看对象本身是否相等,最后才调用equals函数。你这里的point都是同一个对象,在(k = e.key) == key就返回了true,直接找到了e.value

既然get是如此,put必定也是如此。我就点到为止,你自己去看代码吧