Hashmap的内部机制
2016-04-14 12:58
218 查看
1.Hashmap是数据结构中哈希表的实现,可以把它看成是一个线性数组Entry[],每一个数组元素中存储的都是一个链表的头结点,Hashmap中的内容都放在数组中,数组的默认长度为16,每个数组元素都有key,value,next三个属性
2.每当调用Hashmap的put()方法的时候:
int hash=hash(key.hashcode());
int index=hash%Entry.length;
Entry[index]=value;
3.当调用Hashmap的get()方法时,先定位到数组元素再遍历该元素处的链表。
4.若两个不同的对象具有相同的hashcode值,这种现象叫做冲突。
解决冲突的方式有三种:(1)开放地址法,也叫再散列法,分为线性探测再散列,二次探测再散列,伪随机探测再散列
(2)再哈希法,通过构造多个不同的哈希函数
(3)链地址法 (Hashmap采用的方法)
4.rehash
这边提到两个参数,一个是“初始容量”,默认为16,一个是“加载因子”,默认为0.75,将它们相乘得到一个阈值,当Hashmap的大小到达阈值时,就需要扩容,这个时候就要进行rehash操作,rehash操作是非常耗时的,应该尽量避免
2.每当调用Hashmap的put()方法的时候:
int hash=hash(key.hashcode());
int index=hash%Entry.length;
Entry[index]=value;
3.当调用Hashmap的get()方法时,先定位到数组元素再遍历该元素处的链表。
4.若两个不同的对象具有相同的hashcode值,这种现象叫做冲突。
解决冲突的方式有三种:(1)开放地址法,也叫再散列法,分为线性探测再散列,二次探测再散列,伪随机探测再散列
(2)再哈希法,通过构造多个不同的哈希函数
(3)链地址法 (Hashmap采用的方法)
4.rehash
这边提到两个参数,一个是“初始容量”,默认为16,一个是“加载因子”,默认为0.75,将它们相乘得到一个阈值,当Hashmap的大小到达阈值时,就需要扩容,这个时候就要进行rehash操作,rehash操作是非常耗时的,应该尽量避免
相关文章推荐
- Android TintResources Leak
- 数据库索引底层实现
- MJRefresh实现刷新(使用它的Block方法)
- [Spring]Method Injection
- 使用struct ifreq实现ifconfig
- 性能更好的js动画实现方式---requestAnimationFrame
- cookie
- Linux内核设计与实现第八周读书笔记
- 黑马程序员基础评测:Java编程基础
- 其他浏览器均正常显示,uc不显示效果
- 可以免费自学编程的12个网站
- Nodejs数据流(Stream)手册
- 在windows上搭建C语言开发环境——借助eclipse和MinGW
- Android-BroadcastReceiver详解
- Eclipse问题Access restriction: The type 'SunJCE' is not API 解决,并加深理解/jre与/jdk目录下jre的区别
- node.js在webstorm 11中的调试
- session
- seq
- 归并排序求逆序对
- c++ chrono 时间程序库