一个新手对hashMap的理解

      学习java不是很久,hash("哈希")一直是老师和各个面试官提问的重点。在网上搜了一下,在这里写下自己对hash,hashMap , hashCode 的理解。

      首先得说一下什么是hash。hash 也可以叫哈希,也可以叫散列。就是经过一种算法,算出任意长度的输入的对应的固定长度的输出。简单来讲,就是将不定长度转化为固定长度。这种转化,得到的是输入信息的信息摘要。产生的好处有很多,这里就不详细介绍了。有兴趣的可以自己百度。

     那什么是hashMap呢?数组能快速取出任意位置的数据,原因就在于它的数据集中在了一个存储块里面,而它最大的问题就是存储空间固定,这在实际应用中带来不少麻烦。链表可以实现任意长度(这里的任意长度是指存储数据的数据大小),但是它在取出数据时必须按一定的方向遍历过去。各有优缺点。而hashMap把数组和链表结合到了一起。用一个数组来保存地址(即所谓的bucket),通过数组内的地址获得对应的值。

      那hashCode方法扮演了一个什么样的角色呢?前面说了用数组保存数据地址。那数组的下标是多少?我们保存map的时候用的都是键值对。那个键有什么用呢?答案就是通过那个键来计算出数组的下标,从而获得值的地址,进而获得值。

      理清了整个逻辑关系,再来整理一些其中的细节。

      1:怎么根据键的地址来计算出数组的下标?

       调用hashCode()方法生成键的摘要,这个摘要就是一个数字。(具体计算方法建议看代码)

      2:既然是生成摘要,就意味着省略了一部分信息。如果恰好不同的部分被省略掉了,生成的摘要就会一模一样,怎么办?

      这种生成一摸一样的摘要称为“碰撞”。就如题目所说,由于摘要省略了某些东西,碰撞是必然存在的。当碰撞了怎么办?hashMap就只能是用equals()方法,对每个值进行比较,比较出来一样的,就真的是一样的了。所以,一旦发生碰撞,程序的效率就会变慢。减少碰撞的方法就是用好的生成摘要的方法。这种方法就是hash算法。

 (ps:以上是个人对hashMap的整体理解,在其中还有很多细节有待后面的学习和补充。如果有什么意见和建议,请尽管提出。)     

    

猜你喜欢

转载自blog.csdn.net/u012925114/article/details/78948430