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的文章。
- HASHMAP的原理分析
- HashMap的实现原理
- HashMap的实现原理
- hashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- java HashMap的原理
- HashMap的工作原理
- HashMap的工作原理
- HashMap的工作原理
- HashMap的工作原理
- 命令窗口导出oracle数据库的方法及常见问题解决方法
- 【UE4学习】09_SteamVR/Vive/VR 模式下 满屏/去黑边
- 啦啦
- Docker 1.12 Swarm Mode集群实战(第二章)
- Delphi Project 之工程选项(Project Options)
- HashMap的原理
- Hibernate报错:could not initialize proxy -no session以及 one-to-many配置
- 关于mysql函数GROUP_CONCAT
- Windows API函数搜索目录的顺序
- 数据结构实验之栈三:后缀式求值
- JAVA面向对象的思想
- android back键处理
- iOS开发移除所有子视图
- bzoj3223: Tyvj 1729 文艺平衡树