对HashCode 的简单理解

我们都知道数据查询最快的是数组,想ArrayList的底层就使用了数组,数组能够根据下标快速的找到对应的数据。所以ArrayList的查找速度是很快的,但是我们也知道像HashMap还有HashSet,这两种集合的查找速度也是很快。那么HashMap 和HashSet 底层是用什么实现的呢?
其实我们只要研究这两种中的一种集合就可以了,看过HashSet 源码的应该都知道,HashSet 底层实现就是HashMap。
我们都知道Hashcode() 方法是Object 类中的一个本地方法,用关键字native修饰,说明这个方法使用c或者c++实现的。今天我们不去深入的理解这个方法里面到底是如何实现,我们只需要简单的理解为这个方法返回的是该对象的内存地址信息。(其实并不是这么简单,但是这样理解更加形象)

  @HotSpotIntrinsicCandidate
  public native int hashCode();

Hashcode是什么

HashCode是Object的一个方法,hashCode方法返回一个hash code值,且这个方法是为了更好的支持hash表,比如String,Set,HashTable、HashMap等;

Hashcode的重要性

简单的来说,Hashcode 就是为了提高HashMap,HashSet 等集合的效率,我们都知道HashMap和HashSet都是无序的,且里面的值不能相同。那么我们在做add或者put 操作时,就必须要去查询一下该集合中是否有重复元素,我们都知道数组是查询速度最快的数据结构,但是这里面我们没有使用数据,我们又会想到一些二分查找之类的一些查找算法,但是并不能满足我们开发性能。
然后这个时候hashcode 就发挥了很大的做用,底层的原理大致是这样的:
1、我们首先用查找对象的Hashcode去内存中查询该地址中是否有数据已经存在,如果没有存在,那么我们就插入数据。
2、如果已经存在,我们就用equals方法去比较两者的值是否相等,如果相等,那么就不需要去添加数据。
3、如果用equals 方法比较的两个值不相等,那么就会生成一个链表,用来在一个Hashcode中存这两个数据。

通过底层的实现原理,我们可以发现,
1、使用Hashcode方法去查找数据,只需要查找一次,加上equals 方法,总共也就几次,所以我们可以发现为什么HashMap的查找效率高。
2、equals 方法和Hashcode方法总是在一起使用,因为我们需要当两个对象的Hashcode相同时,两个对象不一定相等,当两个对象相等,他的Hashcode一定相等。所以我们一般重写equals方法的时候,也要重写对应的hashcode 方法。

总结:
两个对象相等,hashcode一定相等
两个对象不等,hashcode不一定不等
hashcode相等,两个对象不一定相等
hashcode不等,两个对象一定不等

你可能感兴趣的:(java底层原理,java)