HashMap中关于数组和链表的一些认识
来源:互联网 发布:microsoft visio mac 编辑:程序博客网 时间:2024/05/20 18:15
HashMap底层是通过顺序表(数组)+ 链表实现的,数组中存放的是对象
(1)数组部分进行的操作主要是散列,根据hash算法进行散列,实现快速存储第一步,确定存储在数组的哪个位置。
hash算法的思路:数组范围内的最大质数;代码实现:
hashCode=hashCode^((hashCode>>>20)^(hashCode>>>12));
return hashCode^((hashCode>>>7)^(hashCode>>>4));每一个单位中存储的内容为:key+value+指针,其中指针主要用来进行链表操作。
这就涉及到一个问题,由于数组容量改变,因此需要重新对所有已散列元素重新散列。
因此,在已知HashMap容量的前提下,最好设置HashMap初始大小,防止多次散列。
(2)链表存在主要是为了解决经过hash计算后会有重复值这一问题。
当多次散列后,hash计算结果值一致,需要存放在数组的同一部分,就要使用链表结构。
当一个非空数组中需要存入新的对象,就需要把原来对象中末尾的指针指向新的对象,每次有新的对象key值经过hash计算后得到相同的值,都会重复以上步骤,“往下塞”,使每个对象都能够被访问到。
阅读全文
0 0
- HashMap中关于数组和链表的一些认识
- js中关于数组复制的一些认识(感谢IT民工和见Q,如见人的指导)
- 关于.Net中ThreadPool的一些认识
- Android中关于Task的一些认识
- 关于数字证书和数字签名的一些认识
- 关于分布式的一些理解和认识
- 关于int和Integer的一些认识
- 关于涉及链表和数组中信息交换的一些思考
- 关于MFC中CListCtrl::InsertColumn()和InsertItem()和SetItemText()的一些认识
- 关于表、栈、队列的一些认识
- (每日心得)关于C#中委托和事件的一些认识(二)
- (每日心得)关于C#中委托和事件的一些认识(三)
- 关于hashmap和hashset的一些思考和实验
- 树状数组的一些认识
- 从头认识C—指针和数组的一些浅谈
- 关于HashMap的一些点、、、
- 关于HashMap的一些问题
- 关于HashMap的一些讨论
- floodlight控制器探测拓扑结构
- Libevent源码分析-----跨平台Reactor接口的实现
- JAVA三大特性
- Java面向对象的三大特性
- std::map在遍历的过程中删除item的最好方式
- HashMap中关于数组和链表的一些认识
- (个人)AR电子书创新实训中期报告
- java面向对象的三大特性
- [长期记录]开发中的小知识点
- POJ 1852 Ants G++
- 学习日志 杂文
- 回收站概念+回收站对象命名+查看回收站
- Libevent源码分析-----Libevent工作流程探究
- Java之集合学习