HashMap实现原理
来源:互联网 发布:手机mac地址不可用 编辑:程序博客网 时间:2024/06/07 07:03
HashMap的整体结构如下
简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度依然为O(1),因为最新的Entry会插入链表头部,只需要简单改变引用链即可,而对于查找操作来讲,此时就需要遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
转自:http://www.cnblogs.com/chengxiao/p/6059914.html
所以最终存储位置的确定流程是这样的:
h=hash()怎么计算的?为什么下面例子中(17,“www”)算出的hash=16,存储位置放到table[0]中?
解答:hash()函数实现源码:
final int hash(Object k) { int h = hashSeed; if (0 != h && k instanceof String) { return sun.misc.Hashing.stringHash32((String) k); } h ^= k.hashCode(); // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 at default load factor). h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }
有上述:
hash(16)=1;
hash(17)=0;
public static void main(String[] args){HashMap<Integer, String> hashMap=new HashMap<Integer, String>();hashMap.put(0, "000");hashMap.put(1, "aaa");hashMap.put(2, "bbb");hashMap.put(3, "ccc");hashMap.put(1, "ddd");hashMap.put(16, "qqq");hashMap.put(17, "www");for (Map.Entry<Integer, String> entry:hashMap.entrySet()) {System.out.println(entry.getKey()+" "+entry.getValue());}}
hash
阅读全文
0 0
- HashMap的实现原理
- Java HashMap实现原理
- HashMap的实现原理
- hashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- Hashmap实现原理
- HashMap的实现原理
- Hashmap实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap的实现原理
- HashMap实现原理
- HashMap的实现原理
- Hashmap实现原理
- HashMap的实现原理
- Java HashMap实现原理
- 启动plsql登录界面很慢,要大概十分钟才显示,但是一打开进程是有的
- leetcode_链表总结
- 第四周 项目三 单链表应用 1.
- nio基本使用一
- EasyNVR无插件直播服务器如何使用ffmpeg实现摄像机快照功能的
- HashMap实现原理
- Spring Security3.1登陆验证
- setText()的一个细节导致android.content.res.Resources$NotFoundException: String resource ID #0x7
- Git入门介绍-5-Tags-入门结束篇
- Qt学习笔记:信号和槽机制
- linux软件安装——RPM与YUM
- react native学习笔记10——react-navigation的嵌套使用
- Linux下升级nginx,编译安装nginx-sticky-module
- C语言之一级指针与二级指针剖析