java hashmap的hash冲突问题

git_zw 2016-11-13 05:13:43
自定义一个类:

public class TestObject {
public String name;
@Override
public int hashCode() {
return 1;
}

public TestObject(String name) {
this.name = name;
}

@Override
public boolean equals(Object obj) {
return false;
}
}


写一个main方法
public class test {
public static void main(String[] args) {
HashMap<TestObject,String> hashMap = new HashMap();
TestObject testObject1 = new TestObject("zhangsan");
TestObject testObject2 = new TestObject("lisi");
hashMap.put(testObject1,"abc");
hashMap.put(testObject2, "456");
System.out.println(hashMap.get(testObject1));
System.out.println(hashMap.get(testObject2));
System.out.println(hashMap.size());
}
}


运行结果:
abc
456
2

按照我的理解,因为hashcode都返回1,所以产生hash冲突,执行equals方法,都返回false,应该取不到hashmap里的值才对,为什么能取到值?
...全文
379 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky_08_06_02 2016-11-15
  • 打赏
  • 举报
回复
shinerio 2016-11-14
  • 打赏
  • 举报
回复
hashcode相等,不一定equals,equals则hascode一定相同
逗泥丸的平方 2016-11-14
  • 打赏
  • 举报
回复
去看了hashMap的get (k = e.key) == key || key.equals(k) 还真是阴险
  • 打赏
  • 举报
回复
我知道了 你是觉得get方法应该找不到 你get的是testObject1,testObject2这是同一个对象引用,能够get到是对的啊 如果你new 一个 那就get不到了。 看一下源码应该就清楚了
家里敷泥呀 2016-11-14
  • 打赏
  • 举报
回复
你期待的结果是什么?
git_zw 2016-11-14
  • 打赏
  • 举报
回复
引用 2 楼 lonrence 的回复:
你的意思是Key的hashcode相等,那这两个Key就相等,put方法就会覆盖前值,其实不是的 应该是先比较hashcode 如果相等再比较equals,你定义的TestObject中equals永远是false,所以Key是不相同的 hashMap.put(testObject1,"abc"); hashMap.put(testObject2, "456");abc,456都放入成功。 hash值只是确定了位置,这个位置上通过链表可以放置多个元素。
我知道testObject1和testObject2 都放在同一个位置的链表上,当get的时候先有hashcode定位到这个位置,在equals查找链表上对应的值,但是equals都返回false,应该找不到值才是?
  • 打赏
  • 举报
回复
你的意思是Key的hashcode相等,那这两个Key就相等,put方法就会覆盖前值,其实不是的 应该是先比较hashcode 如果相等再比较equals,你定义的TestObject中equals永远是false,所以Key是不相同的 hashMap.put(testObject1,"abc"); hashMap.put(testObject2, "456");abc,456都放入成功。 hash值只是确定了位置,这个位置上通过链表可以放置多个元素。
git_zw 2016-11-14
  • 打赏
  • 举报
回复
引用 5 楼 lonrence 的回复:
我知道了 你是觉得get方法应该找不到 你get的是testObject1,testObject2这是同一个对象引用,能够get到是对的啊 如果你new 一个 那就get不到了。 看一下源码应该就清楚了
懂了,谢谢
git_zw 2016-11-14
  • 打赏
  • 举报
回复
引用 6 楼 qq_35209952 的回复:
去看了hashMap的get (k = e.key) == key || key.equals(k) 还真是阴险
懂了,谢谢
git_zw 2016-11-14
  • 打赏
  • 举报
回复
引用 4 楼 Q80470101 的回复:
你期待的结果是什么?
返回null

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧