hash表和hashmap

一、哈希表
哈希(hash)表:在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下(后面会探讨下哈希冲突的情况),仅需一次定位即可完成,时间复杂度为O(1),那么哈希表是如何实现使时间复杂度达到O(1)的。我们知道在数组中根据下标查找某个元素,一次定位就可以达到,哈希表就利用了这种特性,哈希表的主干就是数组。
比如我们要新增或查找某个元素,我们通过把当前元素的关键字 通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作。这个函数可以简单描述为:存储位置 = f(关键字) ,这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。
哈希冲突
我们知道数组的长度是固定的,因此不可避免会出现两个不同的元素,通过哈希函数得出的实际存储地址相同的情况,也就是说,当我们对某个元素通过哈希函数进行运算后,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,又叫哈希碰撞。前面我们提到过,哈希函数的设计至关重要,好的哈希函数会尽可能地保证 计算简单和散列地址分布均匀,但是我们知道数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。下面介绍哈希冲突的解决方法:1.开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),2.再散列函数法,3.链地址法。而HashMap即是采用了链地址法,也就是数组+链表的方式。
二、hashmap
HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。(其实所谓Map其实就是保存了两个对象之间的映射关系的一种集合)

//HashMap的主干数组,可以看到就是一个Entry数组,初始值为空数组{},主干数组的长度一定是2的次幂。
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

Entry是HashMap中的一个静态内部类。代码如下:

    static class Entry<K,V> implements Map.Entry<K,V> {final K key;V value;Entry<K,V> next;//存储指向下一个Entry的引用,单链表结构int hash;//对key的hashcode值进行hash运算后得到的值,存储在Entry,避免重复计算/*** Creates new entry.*/Entry(int h, K k, V v, Entry<K,V> n) {value = v;next = n;key = k;hash = h;}

简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

hash表和hashmap相关推荐

  1. 哈希表(HashMap)分析及实现(JAVA)

    转自:http://www.java3z.com/cwbwebhome/article/article8/83560.html?id=4649 ---------------------------- ...

  2. hash表和在java的实现

    这篇博客主要探讨Hash表中的一些原理/概念,及根据这些原理/概念,自己设计一个用来存放/查找数据的Hash表,并且与JDK中的HashMap类进行比较. 我们分一下七个步骤来进行. 一.    Ha ...

  3. Hash表分析以及Java实现

    这篇博客主要探讨Hash表中的一些原理/概念,及根据这些原理/概念,自己设计一个用来存放/查找数据的Hash表,并且与JDK中的HashMap类进行比较. 我们分一下七个步骤来进行. 一.    Ha ...

  4. Java对象容器——Hash表/散列表

    Hash表 也叫做散列表HashMap<k,v> 键是唯一的输出最后一个 Java的Hash表可以以任何实现了hash()函数的类的对象做值来存放对象. 传统意义上的Hash表,是能以in ...

  5. Hash(4) hashtable,hashmap

    首先,我们要知道set是利使用map是实现的,因为只要利用map中的key唯一性就行了. 1.hashmap 和hashtable的区别是什么? 我们可以背出:  hashtable线程安全.hash ...

  6. 哈希(hash)表查找速度为什么那么快?快在哪里了?

    先看数组存储数据是怎么样的. 现在有一个数组,它里面每个单元存储的是数据的地址 这叫指针数组吧,假设它有100个单元 我们称他为p[100] 现在我想把一百个数据(地址)放到里面 我们想把某个数据放到 ...

  7. python hash表

    在查找过程中不经过关键字的比较. 在待查的关键字值和它的存储位置之间建立一个确定的对应关系,则查找时不必再进行关键字值间的比较. 根据设定的哈希函数以及处理冲突的方法将查找表中各个数据元素存储在一段有 ...

  8. 面试官问你什么是Hash表

    Hash表(哈希表),也叫散列表,在这之前还以为这是两种数据结构呢,不知道为啥他俩能扯上关系,翻译了一波才知道,hash就是把--弄乱;斩碎的意思,这下明白名字的由来了. 由于数组的查询快,增删慢,而 ...

  9. Hash表(C语言)

    一.简介: 哈希表又称散列表.哈希表存储的基本思想是:以数据表中的每个记录的关键字 key为自变量,通过一种函数H(key)计算出函数值.把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标 ...

最新文章

  1. 推箱子2-向右推!_保持冷静,砍箱子-me脚
  2. GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别
  3. android标题返回,【Android开发】自定义控件——带返回键标题栏
  4. 记表格设计规范整理与页面可视化生成工具开发
  5. Capture images using V4L2 on Linux
  6. B cannot be cast to java.sql.Blob
  7. jquerymobile在手机上很小_手机如何建立自己的网站
  8. [恢]hdu 1850
  9. IDEA中提示JAVA字符串常量过长
  10. linux命令中info,Linux中zipinfo命令起什么作用呢?
  11. 例4.1 特殊乘法 - 九度教程第39题(数位拆解)
  12. psasp和matlab,PSASP与Matlab/SimPowerSystems联合仿真接口方法研究
  13. c# chart 各个属性_C# WINFORM项目Chart控件显示问题
  14. 软件设计师刷题(2)
  15. 日知录(16):CAD基础工具
  16. 枸杞功效多,这样吃效果翻倍
  17. GLES2.0中文API-glBindFramebuffer
  18. 客制供应商申请审批单和供应商导入api
  19. Linux “挂载” 的概念
  20. 基本控制结构python跳转结构_一文看懂Python的控制结构:for、while、if…都有了...

热门文章

  1. 用hibernate类实现数据库的基本操作
  2. 定义一个泛型为String类型的List集合,统计该集合中每个字符 (注意,不是字符串)出现的次数。例如:集合中有”abc”、”bcd”两个元素, 程序最终输出结果为:
  3. 信息学奥赛一本通(2049:【例5.19】字符串判等)
  4. 信息学奥赛一本通(2028:【例4.14】百钱买百鸡)
  5. 常用技巧 —— 位运算
  6. 信息学奥赛一本通C++语言——1060:均值
  7. 二进制字符串转换到Ascll字符串
  8. 基于android新闻阅读器,Readian News是一款基于Android和网络的新闻阅读器,可让您掌控一切...
  9. python 计算每日累计_5分钟学会用Python可视化数据分析美股
  10. js 匿名函数_编写高质量箭头函数的5个最佳做法