初识散列及java中HashMap

      散列基础

      散列的主要目的是为了快速查找元素,传统的查找方法所用的主要操作都是比较关键字,如二分法,搜索树等,定位到一个元素要做很多次操作,费时费力.而散列可以通过散列函数把关键字直接定位到元素的位置,大大提高了查询效率.

   1 散列函数的选择,常用除余法,很少有完美的散列函数

   2 对关键字冲突的处理,常用开发地址发,链接法等

 

    java中的HashMap

    java中的HashMap采用了链接发,如图

         上面的Entry就是数组中的元素,它持有一个指向下一个元素的引用,这就构成了链表。 
         添加元素时,先根据key的hash值得到这个元素在数组中的位置,然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。

         查找元素时,首先计算key的hashcode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。

 判断两个对象是否相等

   1 判断两个对象的hashCode是否相等
   2 如果不相等,认为两个对象也不相等
   3 如果相等,则判断两个对象用equals运算是否相等
   4 如果不相等,认为两个对象也不相等
   5 如果相等,认为两个对象相等
所以如果key是自定义的类,那么很可能得重载equals()和hashcode()两个方法

  1 hashcode的实现使hashmap里面的元素位置尽量的分布均匀些,主要是为了提高效率

  2 我们重点关注equals()方法,通常都是根据相应的业务逻辑来实现

 

原文地址:https://www.cnblogs.com/79home/p/2475872.html