感觉这种东西都是非常的简单的,但是,没有说好过。从京东,58,机器人,某金融,都在问这个问题。一句话说明白了,参考这里
==和equals都一样,都是进行地址的比较。在计算机里面,每一个对象都有地址,地址相同,那就相同了。但是,String a =new String("123");和String b = new String("1234"),这应该没有被优化了吧。我们看a和b.substring(0,3)是一样的,但是你==的时候,看到不一样,他们是不一个地址。这样,引用类型就重写了equals,地址不同,还要比较值。String a = '123',String b = "123",system.out.println(a == b);那是true的,地址相同,上面的a和b.substring(0,3)遍历比较里面的元素,equals。
然后是hashCode,这可以看作是一个对象的唯一标识呀,他是通过运算出来的,public native int hashCode(); 是有缺点的,是一个本机方法,可以保证你在一个机器上面唯一的,但是,没发保证,你在两台机器上面也唯一,也就是两个机器上面,有可能不同的对象的hashcode可能一样。
一句话,重写equals,就必须重写hashCode。其实他们也没有什么关系,关键是java定了规范,给java的集合用的。京东问的问题,有两种集合,set,list。list可以重复,无所谓了,set不可以重复,怎么保证的。一个一个的遍历!那这1000万你遍历吧,就是使用hash算法,算法的依据就是这个hashCode。根据hashCode做hash算法,找到位置,一次命中,有冲突,两个不同对象的hashcode可能相同,再equals对比,
为什么一定要重新hashCode,在你写equals比较值的时候?其实想让你说的是,hashset存放一个自己写的User("gongsp","good");User("gongsp","good");如果你没有重写hashcode,hashset就不能去重,认为这是两个对象,他们地址不一样呀,你重写equals,他们也不会去重,他们是根据hashcode来做的,默认的hashCode,可以看作地址。

需要你重写一下hashCode的。

equals要逐个比较对象属性,太麻烦,比较hashcode的。为什么,必须重新equals的时候,要重写hashcode。使用set这种场景,hashmap这种场景的。
总结的很清晰

网友评论