HashMap的原理

来源:互联网 发布:淘宝运费险怎么赔付25 编辑:程序博客网 时间:2024/06/04 19:20

HashMap基于哈希表的 Map 接口的实现!

      此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

      上述的话写出了HashMap的两个很重要的特性:

      (1)HashMap是非synchronized。

   (2)HashMap很快;以及HashMap储存的是键值对等等.但他的键或值都可以null实现。

   除此之外,HashMap它的原理是什么样的呢?

   答:HashMap是基于hashing原理,我们使用put(key,value)存储对象到hashCode()方法里面,返回的HashCode用于找到bucket位置来存储Entry对象,这里的关键点在于指出,HashMap是在bucket中存储键对象和值对象,作为Map.Entry.这一点有助于理解获取对象的逻辑。如果你没有意识到这一点,或者错误的认为仅仅只在bucket中存储值得话,你将不会回答如何从HashMap中获取对象的逻辑。

     在这里,特殊说一下,散列法(Hashing)或哈希法是一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。

        bucket:开放式存储空间,不知道对不对!

     对于HashMap来说,首先分配一大片内存,形成许多存储空间,利用hash函数,对Key值进行映射到不同的区域进行保存。其基本存储过程是:

1,得到Key

2,通过hash函数得到hash值

3,得到桶号(一般都为hash值对桶的求模)

4,存放key和value在桶内,这里说的桶,就相当于一个容器!

     但如果两个对象的hashCode相同会怎么样呢?

此时HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.entry对象)会存储在LinkedList中!

当我们调用get()方法,hashMap会使用键对象的hashCode找到bucket位置,然后获取对象。找到bucket位置之后,会调用keys.equals()方法去找到LinkedList中正确的节点,最终找到要找的值对象!

http://blog.csdn.net/gaowenhui2008/article/details/44559249

总结

HashMap的工作原理

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。 HashMap在每个LinkedList节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的LinkedList中。键对象的equals()方法用来找到键值对。

因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。你可以查看更多的关于HashMap和HashTable的文章。


    

0 0