Java中HashCode作用_动力节点Java学院整理

  

  

Java集合中有两类,一类是列表,一类是集他们之间的区别就在集于列表合中的元素师有序的,且可以重复,而设置集合中元素是无序不可重复的。对好于列表处理,但是对于集而言我们要如何来保证元素不重复呢?通过迭代来=()是否相等。数据量小还可以接受,当我们的数据量大的时候效率可想而知(当然我们可以利用算法进行优化)。比如我们向HashSet插入1000数据,难道我们真的要迭代1000次,调用1000次等于()方法吗? hashCode提供了解决方案。怎么实现?我们先看hashCode的源码(对象).

  

<代码>公共int hashCode();

  

它是一个本地方法,它的实现与本地机器有关,这里我们暂且认为他返回的是对象存储的物理位置(实际上不是,这里写是便于理解)。当我们向一个集合中添加某个元素,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。若该处已经有元素存在,就调用=方法来匹配这两个元素是否相同,相同则不存,不同则散列到其他位置。这样处理,当我们存入大量元素时就可以大大减少调用=()方法的次数,极大地提高了效率。

  

所以寻找某个对象在集合中区域位置).hashCode可以将集合分成若干个区域,每个对象都可以计算出他们的哈希码,可以将散列码分组,每个分组对应着某个存储区域,根据一个对象的散列码就可以确定该对象所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率只
  

  

<>强如何理解hashCode的作用:
  

  

以java . lang . Object来理解,JVM每新的一个对象,它都会将这个对象丢到一个散列哈希表中去,这样的话,下次做对象的比较或者取这个对象的时候,它会根据对象的hashcode再从哈希表中取这个对象。这样做的目的是提高取对象的效率。具体过程是这样:

  

1。新对象(),JVM根据这个对象的Hashcode值,放入到对应的哈希表对应的键上,如果不同的对象确产生了相同的哈希值,也就是发生了哈希键相同导致冲突的情况,那么就在这个哈希关键的地方产生一个链表,将所有产生相同Hashcode的对象放到这个单链表上的去,串在一起。

  

2。比较两个对象的时候,首先根据他们的hashcode去哈希表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在哈希表中的同一个键上,那么他们一定在这个键上的链表上。那么此时就只能根据对象的相等的方法来比较这个对象是否相等。当两个对象的hashcode不同的话,肯定他们不能平等。
  

  

<强> . lang。对象中对hashCode的约定:
  

  

,,1. 在一个应用程序执行期间,如果一个对象的=方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。
  

  

,,2. 如果两个对象根据=(对象o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。
  ,

  

,3.如果两个对象根据=(对象o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。

  

,,有一个概念要牢记,两个相等对象的=方法一定为真,但两个hashcode相等的对象不一定是相等的对象。
  所以hashcode相等只能保证两个对象在一个哈希表里的同一条哈希链上,继而通过=方法才能确定是不是同一对象,如果结果为真,则认为是同一对象在插入,否则认为是不同对象继续插入只
  

  


  

  

一个对象的HashCode就是一个简单的哈希算法的实现,虽然它和那些真正的复杂的哈希算法相比还不能叫真正的算法,它如何实现它,不仅仅是程序员的编程水平问题,而是关系到你的对象在存取是性能的非常重要的关系。有可能,不同的HashCode可能会使你的对象存取产生,成百上千倍的性能差别。先来看一下,在JAVA中两个重要的数据结构:HashMap和散列表,虽然它们有很大的区别,如继承关系不同,对价值的约束条件(是否允许null)不同,以及线程安全性等有着特定的区别,但从实现原理上来说,它们是一致的,所以,只以散列表来说明:
  

  

在java中,存取数据的性能,一般来说当然是首推数组,但是在数据量稍大的容器选择中,散列表将有比数据性能更高的查询速度。具体原因看下面的内容,散列表在存储数据时,一般先将该对象的HashCode和0 x7fffffff做与操作,因为一个对象的HashCode可以为负数,这样操作后可以保证它为一个正整数,然后以Hashtable的长度取模,得到该对象在散列表中的索引。

Java中HashCode作用_动力节点Java学院整理