Hashcode的作用

349 阅读2分钟

Hashcode的作用

是什么?

java中的每一个类都有一个hashcode方法,这个方法是用来获取hashcode值,这个值是根据一定的规则将和对象相关的信息(比如对象的存储地址,对象的字段等)计算生成的,这个值的作用就是为了提高集合的性能,像HashSet、HashMap 以及 HashTable

干什么?

java的集合有两类,一个是List,一个是Set,前者是有序可重复的,后者无序不可重复,当在Set 中插入值的时候怎么判断是否有已经存在的元素,可以通过equals方法来判断,但是当元素过多的时候,就会显得力不从心。

所以就有了hashcode方法:它返回的是根据对象的内存地址换算出的一个值,这样,当集合要添加新的元素时候,先调用这个元素的hashcode方法,这样就可以直接定位到它所应该放的物理位置:

  • 如果这个位置上没有元素,那么就不用进行equals比较了,直接储存在这个位置上
  • 如果这个位置上有元素,就调用它的equals方法和新元素进行比较,相同的话就不存了
  • 不相同的话就是发生了HashKey 相同导致的冲突的情况,就会在冲突的地方产生一个链表,将产生相同的hashcode 的对象放到这个单链表上去,串起来,这样以来就大大的减少了实际调用equals方法的次数,几乎只需要一两次

如何理解HashCode的作用

从Object角度看,JVM每new一个Object,它都会将这个Object丢到一个Hash表中去,这样的话,下次做Object的比较或者取这个对象的时候(读取过程),它会根据对象的HashCode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。若HashCode相同再去调用equal。

HashCode有哪些特性?

  1. HashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,HashCode经常用于确定对象的存储地址;
  2. 如果两个对象相同, equals方法一定返回true,并且这两个对象的HashCode一定相同;
  3. 两个对象的HashCode相同,并不一定表示两个对象就相同,即equals()不一定为true,只能说明这两个对象在一个散列存储结构中
  4. 如果对象的equals方法被重写,那么对象的HashCode也尽量重写。