`
knight_black_bob
  • 浏览: 821400 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HashMap 原理分析

阅读更多

 

 转:http://blog.csdn.net/vking_wang/article/details/14166593

 

HashMap的数据结构

 

数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。

数组

数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难

链表

链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。

哈希表

那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。

  哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为链表的数组 ,如图:

 


 

  从上图我们可以发现哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。

  HashMap其实也是一个线性的数组实现的,所以可以理解为其存储数据的容器就是一个线性数组。这可能让我们很不解,一个线性的数组怎么实现按键值对来存取数据呢?这里HashMap有做一些处理。

  首先HashMap里面实现一个静态内部类Entry,其重要的属性有key , value, next,从属性key,value我们就能很明显的看出来Entry就是HashMap键值对实现的一个基础bean,我们上面说到HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。

 

 

HashMap的存取实现

既然是线性数组,为什么能随机存取?这里HashMap用了一个小算法,大致是这样实现: 

 

 

// 存储时:
 int hash = key.hashCode(); // 这个hashCode方法这里不详述,只要理解每个key的hash是一个固定的int值
 int index = hash % Entry[].length;
 Entry[index] = value;
 
// 取值时:
 int hash = key.hashCode();
 int index = hash % Entry[].length;
 return Entry[index];

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

分享到:
评论

相关推荐

    java HashMap原理分析

    详细分析HashMap的存储原理,key值的hash地址以及扩容

    hashmap实现原理

    hashmap的底层及源码解析,很适合大家的学习,不要积分。

    HashMap原理分析及性能优化

    文章目录一.HashMap是什么二.HashMap继承类对比分析三.HashMap源码相关单词含义四.HashMap如何确定哈希桶数组索引位置五. HashMap 的 put 方法分析六.HashMap扩容机制七.HashMap线程安全性 一.HashMap是什么 ...

    hashMap基本工作原理,图解分析,基础Map集合

    hashMap基本工作原理,图解分析,基础Map集合

    hashmap原理和扩容.docx

    hashmap的扩容原理以及如何扩容,部分源码的分析。希望对大家有所帮助

    图解hashMap工作原理

    hashMap基本工作原理,图解分析,基础Map集合

    HashMap源码分析-思维导图.xmind

    hashmap的原理啊思想。

    Java8 HashMap的实现原理分析

    Java8之后新增挺多新东西,接下来通过本文给大家介绍Java8 HashMap的实现原理分析,对java8 hashmap实现原理相关知识感兴趣的朋友一起学习吧

    HashMap 源码分析

    首先,我们了解一下HashMap的底层结构历史,在JDK1.8之前采用的是数组+链表的数据结构来存储数据,是不是觉得很熟悉,没错这玩意在1.8之前的结构就和HashTable一样都是采用数组+链表,同样也是通过链地址法(这里简称...

    HashMap新增数据原理.docx

    深入理解HASHMAP底层原理,通过对源码进行解析分析HASHMAP执行过程,一篇文章帮助你深刻理解HASHMAP

    java中HashMap的原理分析

    HashMap在Java开发中有着非常重要的角色地位,每一个Java程序员都应该了解HashMap。详细地阐述HashMap中的几个概念,并深入探讨HashMap的内部结构和实现细节,讨论HashMap的性能问题

    Java HashMap实现原理分析(一)

    主要介绍了Java HashMap实现原理的分析,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下

    java 中HashMap实现原理深入理解

    主要介绍了java 中HashMap实现原理深入理解的相关资料,需要的朋友可以参考下

    Java实现简易HashMap功能详解

    主要介绍了Java实现简易HashMap功能,结合实例形式详细分析了Java实现HashMap功能相关原理、操作步骤与注意事项,需要的朋友可以参考下

    HashMap(二)原理讲解

    1.HashMap的继承体系是怎么样的?...4.put数据原理分析? Node数组的长度一定是 2^n次方长度 5.什么是Hash碰撞?链化? 指的是,相同 hash 值的键值对会发生冲突组成链表 时间复杂度 由O(1)退化为O(n) 6.J

    在Java8与Java7中HashMap源码实现的对比

    主要介绍了在Java8与Java7中HashMap源码实现的对比,内容包括HashMap 的原理简单介绍、结合源码在Java7中是如何解决hash冲突的以及优缺点,结合源码以及在Java8中如何解决hash冲突,balance tree相关源码介绍,需要的...

    java源代码原理视频.txt

    java源代码原理,深入理解HashMap原理、高可用redis集群架构、zookeeper分布式、海量数据缓存、springAOP底层源码分析等

    HashMap集合,最详细底层源码分析及put ,get方法运行原理

    HashMap集合非线程安全; HashMap集合继承关系,实现的接口有: public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { } HashMap集合继承了Map集合,实现了Map,Cloneable,...

    ConcurrentHashmap源码

    源码分析见我博文:http://blog.csdn.net/wabiaozia/article/details/50684556

    Java开发面试必备知识技能总结视频合集

    HashMap源码分析与实现、JVM底层奥秘ClassLoader源码分析与案例讲解、大型网站数据库瓶颈之数据库分库分表方案实践、Spring Cloud Eureka场景分析与实战、分库分表之后分布式下如何保证ID全局唯一性、RPC底层通讯...

Global site tag (gtag.js) - Google Analytics