昨晚京东笔试中的一道选择题


public class Demo4 {
public static void main(String[] args) {
Set<MyClass> set=new HashSet<>();
set.add(new MyClass(5));
set.add(new MyClass(2));
set.add(new MyClass(6));
System.out.println(set.size());
}
}
class MyClass{
Integer i;
public MyClass(Integer y) {
i=y;
}
public boolean equals(MyClass c) {
System.out.println("equals(MyClass c)");
return false;
}
public boolean equals(Object o) {
System.out.println("equals(Object o)");
return true;
}
public int hashCode() {
System.out.println("hashCode()");
return 32;
}

}
如上面的代码,想知道为什么hashSet在添加元素时,当hashCode相等时,调用的equals方法首先是public boolean equals(Object o),当这个方法不存在时才是 public boolean equals(MyClass c) ,有点懵逼,希望各位大佬给出解答,谢谢

#笔试题目#
全部评论
不是这样的呀,public boolean equals(MyClass c)这个方法是永远也不会调用的,除非你手动调用,而public boolean equals(Object c)这个方法相当于回调函数,HashSet的原理就是利用HashMap的key的唯一性,hashmap首先用hashcode%桶的数量得到哪一个桶,再调用equals(Object c)这个方法判断这个key是否在该桶中。 这是重载,是静态方法调用,所以你就算重载了equals(MyClass c)方法,它调用的还是equals(Object c),如果这个类没有equals(Object c),就会调用Object的equals(Object c)方法。
点赞 回复
分享
发布于 2018-04-10 15:44
当时想的以为考察的是泛型擦出,不知道对不对
点赞 回复
分享
发布于 2018-04-10 15:34
联想
校招火热招聘中
官网直投
我感觉equals(Object o)属于重载,hashcode相同时,键值equals对比第一个调用这个equals(Object o)是没什么毛病的。楼上说的参数重载不调用这个也不无道理。
点赞 回复
分享
发布于 2018-04-10 15:46
g了 选成3了,我看的jdk1.7的源码,在这个过程中调用equals方法传进去的是Object类型,自然就会调用Object c,不会调用MyClass c,这是重载,而且hash值相等也不一定会调用equals吧
点赞 回复
分享
发布于 2018-04-10 16:28
因为HashMap中调用了方法 “key.equals(k)” 来比较key是否相等,在JDK1.7中:Object k;JDK1.8中:泛型 K k;  都是调用equals(Object obj)方法,不会调用equals(MyClass c)这个重载的方法;如果没有重写equals(Object obj)方法,调用的是Object 的equals(Object obj)方法.
点赞 回复
分享
发布于 2018-04-24 21:11

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务