关于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的基 ... 
随机推荐
- nginx keepalived 主从切换
			注: LVS + Keepalived 不知道为什么出现一个很郁闷的问题....... ------------------------------------------------------ ... 
- 将UTF8编码转化为中文 - NSString方法
			方法一: 代码如下,如有更好的方法 麻烦贴出来,这个方法是通过webview进行解码的 UIWebView *web = [[UIWebView alloc] init]; NSString *tsw ... 
- 反射技术在Android中的应用
			本博客转自:http://blog.csdn.net/tiefeng0606/article/details/51700866 动态语言: 一般认为在程序运行时,允许改变程序结构或变量类型,这种语言称 ... 
- Handler和Message以及Looper之间的三角关系
			说到Handler想必大家都经常用到,在非UI线程更新UI那可是利器,用起来也非常容易上手 从使用上来说,我们只需要关注sendMessage和handleMessage即可 所以我们先从Handle ... 
- PC端 H5实现拍照并上传
			<!DOCTYPE HTML><html><head> <meta charset="UTF-8"> <meta name=& ... 
- dom对象中的this和event.target区别
			1.this是事件冒泡,动态变化.先触发内部事件,由内到外的执行. <script> function testdiv(val){ console.log(val.id); } funct ... 
- xamarin mac 基础知识 之 界面
			有两种方式创建界面:代码和xaml 
- 让VLC也拥有斷點播放功能
			如何让VLC也拥有记忆功能,记住上次播放位置.以下都是在Windows系统下操作,其他 方法/步骤 下载 libsrpos_plugin-0.5.win 插件 https://sourceforge. ... 
- Dev的关于XtraGrid的使用2
			接着说,GirdControl如何定位和查找指定列显示值的行(注意是列的实显示值,而不是关联数据源列值) 下面请看代码: using DevExpress.XtraGrid.Views.Base; u ... 
- 内容页获取当前栏目的上一级栏目ID
			发现V9在列表页可以用$parentid 得到当前栏目的父级ID,但在内容页这个函数的值却为空了,需要按下面的写法才行, V9 在内容页获取当前栏目的上一级栏目ID {$CAT[parentid]} ... 
