面试题--HashMap底层的实现
2016-04-20 08:42
453 查看
首先我们来看看HashMap的底层源码
我们可以看到底层其实就是一个数组,而且是一个Entry类型的数组,我们来看看Entry类的源码
它是一个静态内部类,成员变量有我们放进去的key,value以及指向下一个Entry对象的引用当我们调用put方法时
它首先根据key值生成一个hash值,并通过以下方法
得到数组的存放位置,如果该位置已经有对象存在了,就顺着此对象的链开始寻找,如果e.hash == hash && eq(k, e.key)返回为真就用新的对象替换旧的对象并将旧的对象返回,如果都不成功,表示在链上不存在,这个时候就直接添加到数组,同时将添加的这个Entry的next指向被替换的那个Entry对象,实现如下
总的来说HashMap底层是用数组来实现,而每一个数组元素又可以当成一个链表的头,这样做是为了提高查询的效率,使得查找时间不会随Map的大小而改变
/** * Constructs an empty <tt>HashMap</tt> with the default initial capacity * (16) and the default load factor (0.75). */ public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); table = new Entry[DEFAULT_INITIAL_CAPACITY]; init(); }
我们可以看到底层其实就是一个数组,而且是一个Entry类型的数组,我们来看看Entry类的源码
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; final int hash; Entry<K,V> next;
它是一个静态内部类,成员变量有我们放进去的key,value以及指向下一个Entry对象的引用当我们调用put方法时
public V put(K key, V value) { = maskNull(key); int hash = hash(k); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { if (e.hash == hash && eq(k, e.key)) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, k, value, i); return null; }
它首先根据key值生成一个hash值,并通过以下方法
static int indexFor(int h, int length) { return h & (length-1); }
得到数组的存放位置,如果该位置已经有对象存在了,就顺着此对象的链开始寻找,如果e.hash == hash && eq(k, e.key)返回为真就用新的对象替换旧的对象并将旧的对象返回,如果都不成功,表示在链上不存在,这个时候就直接添加到数组,同时将添加的这个Entry的next指向被替换的那个Entry对象,实现如下
void addEntry(int hash, K key, V value, int bucketIndex) { try<K,V> e = table[bucketIndex]; table[bucketIndex] = new Entry<K,V>(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); }
总的来说HashMap底层是用数组来实现,而每一个数组元素又可以当成一个链表的头,这样做是为了提高查询的效率,使得查找时间不会随Map的大小而改变
相关文章推荐
- 码农录歌心得
- 【软工面试】一个文件有N个单词,每行一个,快速找出一个单词x,已知该单词出现的次数大于N/2
- 有些工具程序员不用也要掌握(想到就写,不定期更新)
- 12 年程序员职业生涯得到的 12 个经验教训
- 【PHP】 foreach循环中变量引用的一道面试题
- 程序员你为什么迷茫?
- 生活不只有诗和远方,还有傻逼上司!
- Java面试
- 我真的稀里糊涂混成了游戏骑引擎是程序员(中间加字为避免被搜索到)
- 程序员如何在互联网的今天赚钱快速
- 程序员如何在互联网赚钱快速
- 腾讯PHP面试必备知识
- Java精度类型转换面试题
- 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
- ava 面试题:编译时与运行时
- Java 面试题:编译时与运行时
- 教师面试详细流程
- SharePoint 轻量化应用之HR招聘系统之初试结果通知及复试面试通知表单
- 程序员编码大赛第三届编码大赛第三题
- Java继承、多态面试题