关于hashmap的底层实现
注:以下内容并非基于最新的jdk版本
q1:hashmap为什么叫hashmap?
答:hashmap基于hashtable(不是hashtable类)实现。
q2:hashtable(不是hashtable类)又什么?
答:hashtable是一个数组加链表的数据结构,以下使用hashmap举例说明

当我们new 一个hashmap()的时候,会生成一个length=16的数组,当然我们也可以使用hashmap()的有参构造方法初始化一个更合适的length,通过key的hashcode%length作为这个键值对node要放在哪个数组元素的链表中。那么问题又来了,为什么hashmap要用这种结构,而不是数组或者链表,那么我们就要考虑到两者的弊端,而hashtable综合了两者的优点,在数据同时需要增删和查询的时候hashtable无疑是更好的选择。
public V put(K key, V value) {
if (key == null)
//如果key是null的话
return putForNullKey(value);
//获得hashcode
int hash = hash(key.hashCode());
//得到索引
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
//通过遍历链表查看是否有相同的key,map中不予许有相同的key
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
//这里就是替换老的值值得注意的是put()方法是有返回值的,返回相同key值得value
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}</p><p> modCount++;
//这里如果没有我们就建立一个新的节点,注意后来的要放在链表前面,它不像linkedlist是双向链表,这里是单向的
addEntry(hash, key, value, i);
return null;
}
这里的hashmap是key是可以为null的,这时候不会去求它的hashcode,而是直接放在了table0的位置。
private V putForNullKey(V value) {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(0, null, value, 0);
return null;
}
这里不用多解释
q3:hushmap和hashtable的区别
两者在数据结构的实现上基本相同,区别在于hashtable线程安全,hashmap不安全,而且hashtable的key值是不支持null对象的。否则抛出nullpointerException
猜想:hashmap通过hashtable的方式很好的实现了数组和链表的结合,但是它是有取舍的,也就是它的综合性能好,我们可以通过我们的实际需求来决定我们是更快的增删还是更快查询
关于hashmap的底层实现的更多相关文章
- hashmap的底层实现
HashMap的底层实现都是数组+链表结构实现的,添加.删除.获取元素都是先计算hash值,根据hash值和table.length计算出index也就是table的数组的下标,然后进行相应的操作. ...
- 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用
转自:http://kakajw.iteye.com/blog/935226 一.java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例:又可以说是 ...
- HashMap的底层实现原理
HashMap的底层实现原理1,属性static final int MAX_CAPACITY = 1 << 30;//1073741824(十进制)0100000000000000000 ...
- HashMap的底层原理(jdk1.7.0_79)
前言 在Java中我们最常用的集合类毫无疑问就是Map,其中HashMap作为Map最重要的实现类在我们代码中出现的评率也是很高的. 我们对HashMap最常用的操作就是put和get了,那么你知道它 ...
- HashMap的底层结构和原理
http://youzhixueyuan.com/the-underlying-structure-and-principle-of-hashmap.html HashMap是Java程序员使用频率最 ...
- HashMap的底层原理 cr:csdn:zhangshixi
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变 ...
- 实在没想到系列——HashMap实现底层细节之keySet,values,entrySet的一个底层实现细节
我在看HashMap源码的时候发现了一个没思考过的问题,在这之前可以说是完全没有思考过这个问题,在一开始对这个点有疑问的时候也没有想到居然有这么个语法细节存在,弄得我百思不得其解,直到自己动手做实验改 ...
- HashMap的底层原理
简单说: 底层原理就是采用数组加链表: 两张图片很清晰地表明存储结构: 既然是线性数组,为什么能随机存取?这里HashMap用了一个小算法,大致是这样实现: // 存储时: int hash = ke ...
- 再学Java 之 HashMap的底层实现
今天参加欢聚时代的面试,我说我自己依靠自己的理解重新实现过HashMap.描述我自己的实现思想后,面试官问“hashmap”底层如果用数组不是效率比较低吗,不是更应该用红黑树吗?我一下子就蒙了.用数组 ...
- 面试题:HashMap和ConcurrentHashMap的区别,HashMap的底层源码。
Hashmap本质是数组加链表.根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap:在hashMap的基 ...
随机推荐
- iOS开发——实时监控网速(仅作参考,发现一点问题)
开发中用到获取网速的地方,应该就两种: 1.下载速度,这种可以直接在接受数据的地方统计计算.这个就不讲了. 2.获取手机网卡的数据,可以监控网卡的进出流量,下面就是. #import "Vi ...
- iOS学习笔记1--在xcode6以上的版本中不使用storyboard以及部分控件使用
首先建立一个iOS新工程,删除工程自动建立的main.storyboard以及xib文件,并且在info.plist上删除这两个选项 然后在项目配置中将maninterface设置为空,将launch ...
- 字典NSDictionary的常见用法
// 动态获取字典的第一个典 NSString *firstKey = responseObject.keyEnumerator.nextObject;
- label同时设置sizeToFit,NSTextAlignmentCenter不起作用
问题:label要多行显示,按照这样子设置,iOS9以上work,iOS8无用 self.bookNameLabel.lineBreakMode = NSLineBreakByCharWrapping ...
- AJAX异步加载
AJAX含义: 即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX可以跨 ...
- redis 高级配置
一.安全性 设置密码:在配置文件中设置 requirepass 123456 由于redis的速度非常快,每秒可以进行15万次的暴力破解,所以密码设置要强壮些 在客户端登录或者连接的时候,使用 aut ...
- 多因子降维法(MDR,multifactor dimensionality reduction)
多因子降维法(MDR,Multifactor Dimensionality Reduction ) MDR是近年统计学中发展起来的一种新的分析方法.其中,“因子” 即交互作用研究中的变量,“维” 是指 ...
- 一点养老APP模式定制系统平台源码
一点养老APP模式定制系统开发:136.1013.1824电/微:搭建一点养老APP模式定制系统平台.专注于为企业和商家客户提供基于腾讯微信公众平台系统程序和APP等开发服务,中国养老金融50人论坛2 ...
- andorid 开放工具集合
1.开放工具集合 http://www.androiddevtools.cn/
- js原生之一个面向对象的应用
function IElectricalEquipment() { } IElectricalEquipment.prototype = { poweron: fu ...