JAVA基础之重写equals和hashcode

前言 

 我之所以写些以前学的JAVA基础的东西是为了以后假如作为面试官,去招聘初级程序员时候,对自己招聘的人负责,不管他是否应聘成功,他能从这里学到点什么,毕竟成年人时间很宝贵,再就是我想为公司招聘到真正有想法的人。虽然说能力很强有个性的人太多也不好,但是总比一群庸碌的人要好。

首先谈下hashcode

基本类型int double等是没有hashcode方法的 包装类型Integer的hashCode是本身的值 String类型需要计算 代码如下

为什么字符串9的hashcode是57 String重写了hashcode 算法如下

经过计算 字符串9的计算可以演化成 var1=31*0+"9"; 那么为什么0+"9"等于57呢 因为"9"的ASCII码为57


字符参与运算,其实是拿字符对应的码表中的数字进行运算的。

那么为什么会拿31计算呢

先要明白为什么需要HashCode.每个对象根据值计算HashCode,这个code大小虽然不奢求必须唯一(因为这样通常计算会非常慢),但是要尽可能的不要重复,因此基数要尽量的大。另外,31*N可以被编译器优化为左移5位后减1即31*N = (N<<5)-1,有较高的性能。使用31的原因可能是为了更好的分配hash地址,并且31只占用5bits! 
所以从效率上它是2的5次减1,对计算机来说2的乘除操作只需要做位移操作,例如*32就是左移5位。 也就是说31对计算机的角度来说运算更快、切占内存不多不少,而且形成惯例,虚拟机甚至都专门对他做了优化。所以常用31做系数算hashcode 

先不管上面的结论百度出来的是否正确,我们招聘人的时候不以结果正确来判定,主要是有没有深度思考,有没有求知欲,我觉得这个才是最重要的。

上面还可以衍生出另外一个问题,

Java类是如何默认继承Object的? 因为String类是没有显示去继承Object方法的hashcode方法的。

这里不做细述。感兴趣点击下面文章自己做测试。

https://www.cnblogs.com/ibigboy/p/10642157.html

那么经过上面的热身 我们言归正传。

 

get(key2)的时候获取的是null IDEA都看不下去只能提示了。。因为没有重写hashcode方法因此hash值就是key1对象的内存地址

而key2又是一个新的对象,不同地址在没有重写hashcode的情况下当然不一样。那么是不是只要重写hashcode就行了呢

但是重写hashcode方法后 为什么运行代码还是null.  所以我们还要继续重写equals方法

这次运行就不会有问题了

其实问题的本质还是要看hashmap的get和put方法源码 这里只是做一个抛砖引玉。

也就是说我们在重写equals以及hashcode方法时候 本事是想这个类在HashMap和HashSet这样的集合中正常工作.不然没必要重写它们。

稍微深入的了解可以参考权威书籍 Effective Java里面有相关内容会更加权威。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值