(JDK源码分析)万事从开头难,Object源码解析

2020-05-04  本文已影响0人  Java的J

本文参考大佬博客:

https://www.cnblogs.com/ysocean/p/8419559.html

https://www.cnblogs.com/whgk/p/6071617.html

    开始学java的时候老师总会说这样一句话,java中的每个类都继承了Object,抱着试试的心情在IDEA中打开了Object的类。

方法图

    仔细一看也没几个方法,但根据个人知识体系的不同,学习的方法也不同 比如 wait  notify 都是与线程有关的,如果你没有类似的编程经验可以先放一放。这里先从java基础的角度说起。

    看到这些方法的时候,我的第一注意力是被 equals 和 hashcode 方法吸引了,面试常客。

什么是hash?什么是hashcode?

    hash这个比较好理解,一种算法,目的是把数据转换位一个标识

来自百度百科

    hashcode就是通过hash函数得来的,通俗的说,就是通过某一种算法得到的,hashcode就是在hash表中有对应的位置。Java中每个对象都是继承了Object类,那就是说他们都有自己的hashcode。


具体是怎么产生hashcode的?

    对象都有一个唯一物理地址,对象的物理地址和hashcode地址不一样,hashcode代表对象的地址说的是对象在hash表中的位置,物理地址说的对象存放在内存中的地址。

    对象的内部地址转换成一个整数,然后该整数通过hash函数的算法就得到了hashcode,也就是在hash表中对应的位置。举个例子,hash表中有 hashcode为1、hashcode为2、(...)3、4、5、6、7、8这样八个位置,有一个对象A,A的物理地址转换为一个整数17(这是假如),就通过直接取余算法,17%8=1,那么A的hashcode就为1,且A就在hash表中1的位置。

内存地址不香吗,干嘛用hashcode???

    来个例子,我们有一个能存放1000个数这样大的内存中,在其中要存放1000个不一样的数字,用最笨的方法,就是存一个数字,就遍历一遍,看有没有相同得数,当存了900个数字,开始存901个数字的时候,就需要跟900个数字进行对比,这样就很麻烦,很是消耗时间,用hashcode来记录对象的位置,来看一下。hash表中有1、2、3、4、5、6、7、8个位置,存第一个数,hashcode为1,该数就放在hash表中1的位置,存到100个数字,hash表中8个位置会有很多数字了,1中可能有20个数字,存101个数字时,他先查hashcode值对应的位置,假设为1,那么就有20个数字和他的hashcode相同,他只需要跟这20个数字相比较(equals),如果每一个相同,那么就放在1这个位置,这样比较的次数就少了很多,实际上hash表中有很多位置,这里只是举例只有8个,所以比较的次数会让你觉得也挺多的,实际上,如果hash表很大,那么比较的次数就很少很少了。

    HashCode的存在是为了查找的快捷性,HashCode是用来在散列存储结构中确定对象的存储地址的。(真香~)

回头看看equals方法

来自Object源码

太常规了!!!  ==  号  不就是比较内存地址相等嘛,我在想其它类也是这样嘛,打开String的源码类看了下

String的equals

被重写了仔细看看比较字符是否相等,这么说这个方法的目的是比较两个对象的值是否相等或内存地址相等至少现在我们看到的是这样的。但发现hashcode方法也被重写了。

String中hashcode 发现了Object中的一句话 equals上面的注释

相等的对象必须有相同的hashcode,重写equals方法的时候你也要重写hashCode方法

equals方法和hashcode的关系?

再回到上面的例子:上面说的hash表中的8个位置,就好比8个桶,每个桶里能装很多的对象,对象A通过hash函数算法得到将它放到1号桶中,当然肯定有别的对象也会放到1号桶中,如果对象B也通过算法分到了1号桶,那么它如何识别桶中其他对象是否和它一样呢,这时候就需要equals方法来进行筛选了。

equals相等,hashcode一定是相等的

hashcode相等,equals不一定相等

Object类测试

测试一 结果一

 equals不想等,hashcode也不相等,结合思考下,equals不相等,但hash也有可能相等的

结论

   1、两个对象相等,其 hashCode 一定相同;

   2、两个对象不相等,其 hashCode 有可能相同;

   3、hashCode 相同的两个对象,不一定相等;

  4、hashCode 不相同的两个对象,一定不相等;

想不通?大脑里面过一下那个桶的例子再想想。

最后Object中还有一个native关键字,内容太多了,另外的文章在做补充。

上一篇 下一篇

猜你喜欢

热点阅读