整理所学之HashMap | 第一篇

本文参考:

https://blog.csdn.net/yyyljw/article/details/80903391

https://www.jianshu.com/p/a89e9487a06c

https://blog.csdn.net/woshimaxiao1/article/details/83661464

https://blog.csdn.net/eaphyy/article/details/84386313

所学浅薄,抛砖引玉。

这里会涉及:

1. 哈希表

2. HashMap 的hash算法

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

3. HashMap 查找数组下标为什么是

(n - 1) & hash

哈希表

散列表(也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

  来让我们在研究哈希表之前,先看下其他数据结构

  数组:是在内存中存储相同数据类型的物理上连续的空间。特点:查找快,插入、删除等更新操作慢。

  线性链表:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。特点:查找慢,插入、删除等更新操作快。

  那么,是否可以设计一种数据结构,结合数组和链表?这就是哈希表。

  哈希表特征:

  1. 哈希表的存储是key、value形式的。

  2. 哈希表的主干就是数组,数组的下标是通过函数确定的,即:地址index=f(key),这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。

  3. 数组的元素是链表形式

  例子:

现有一个Person类包含name(假设姓名唯一)跟age的两个属性,要从1000个Person对象中找出name为“张三”的对象你该怎么做?
有些同学要说话了:将1000个Person对象放入ArrayList中,再遍历ArrayList找出name为“张三”的对象不就得了。
是的这种方法是可以的,但是假如张三恰好在最后一个那么就意味着要遍历1000次,这样效率就会非常低下,那么我们有没有什么办法来解决这种问题呢?

这个例子哈希表的解决方案,参见:TODO

原文地址:https://www.cnblogs.com/bloodthirsty/p/12015813.html

时间: 2024-08-05 10:49:19

整理所学之HashMap | 第一篇的相关文章

零基础学cocos2dx 3.0(顺带学C++)第一篇 切换场景

不会去重复一些概念性的东西,具体的内容,我在代码中已经备注出来.先看目录,这个创建完项目目录的Classes文件夹下有4个文件,我把helloworld那两个文件直接改了名字,这里我叫MainScene .切记,在改为名字之后需要到appDelegate.pp里面把对应的helloworld改过来. 废话不多说,直接上代码 1,appDelegate.h #ifndef _APP_DELEGATE_H_ #define _APP_DELEGATE_H_ #include "cocos2d.h&q

入木三分学网络第一篇--VRRP协议详解第一篇(转)

因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静态网关出现单点失效现象的路由协议. VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器(位于一个虚拟路由器组中, 在该组中,只有一台路由器--master路由器工作,转发数据包,其它路由器是backup路由器,不参与转发数据包),以及在实

跟着鬼哥学so修改,四,实例第一篇

跟着鬼哥学so修改,四,实例第一篇 图/文  听鬼哥说故事 ---------------------------------------------分割线-------------------------------------------- 这篇文章是前段时间的文章,最近这个系列的so分析刚好可以做为一个实例教程,所以就补充拿回来了. 前三篇没看的,请继续关注博客,看完前面三篇. 趁热打铁,加深对so的分析过程,于是就有了这篇文章的补充························ 另,此

Flask最强攻略 - 跟DragonFire学Flask - 第一篇 你好,我叫Flask

首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 一. Python 现阶段三大主流Web框架 Django Tornado Flask 对比 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不管你用得到用不到,反正它全都有,属于全能型框架 2.Tornado 主要特点是原生异步非阻塞,在IO密集型应用和多任务处理上占据绝对性的优势,

前端学HTTP之报文系列第一篇——起始行

前面的话 如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了.HTTP报文是在HTTP应用程序之间发送的简单的格式化数据块,每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应.它们由三个部分组成:由起始行.首部和实体的主体部分.本文是HTTP报文系列第一篇——起始行 报文语法 所有的HTTP报文都可以分为两类:请求报文(request message)和响应报文(response message).请求报文会向Web服务器请求一个动作,响应报文会将请求的结果返回给客

致我的第一篇博文

前言:敲代码也一定的时间了,所谓好记性不如烂笔头,所以大家快写自己的博文吧. 第一篇还真不知道如何下笔,感觉高中时期把自己肚子里的货全部都半空了,大学基本上就没出货了,追忆往事,我高中的文笔还是不错的,高考语文快130分了,一把辛酸一把泪,现在真是能憋死英雄汉. 所以文章还是要写的,现在入行程序员,项目上的一些积累还是需要整理的,自己平时学的东西啊,书籍啊,多写写笔记也是不错的,第一篇也不需要长篇大论什么的,开头就写给自己:现在的你水平有限,你要加油啊! ps:糖小宝,我爱你!我会加油的!

互联网神经学系列第五篇:研究大脑中的谷歌,脸书和华为思科路由,脑互联网生理学

本文是互联网神经学系列第五篇-"大脑中的类互联网应用和结构,脑互联网生理学" 一.人类大脑研究的困境 大脑的秘密一直是科学皇冠上最明亮的宝石之一,但在两千年前,人们确连它的重要意义还不知道,例如著名的亚里士多德(Aristotle,公元前384-前322)认为神智在心,是心控制着我们的思想,情绪.大约公元前5世纪,地中海科斯岛上托名希波克拉底(Hippocrates)的一群医生被认为是最早发现了脑是神智的载体,在希波克拉底著作中有如下一段话."人们应当认识到:我们的愉悦.欢乐

web 前端入坑第一篇:web前端到底是什么?有前途吗

web前端到底是什么? 某货: "前几年前端开发人员鱼目混杂,技术参差不齐,相对学习起来不规范,导致> 前端开发人员聚集,所以现在前端工种和工资还是没得到普遍重视,但近2年来,> > HTML5.JS 的流行,让前端异常火爆,以后还会更有前途吗?请问您怎么看?" 我 "我只能告诉你:前端不灭""除非你不要脸!""前些年因为国内都不要脸,然而现在都明白了用户体验至上,现在都要脸:""不但要脸 还要胸大

第一篇 SQL Server安全概述

本篇文章是SQL Server安全系列的第一篇,详细内容请参考原文. 面对当今复杂的攻击SQL Server有你需要的一切来保护你的服务器和数据.但在你能有效地使用这些安全功能之前,你需要了解你所面临的威胁和一些基本的安全概念.本系列的第一篇将讲解基础知识,可以充分利用SQL Server中的安全功能而不是浪费时间在不能保护你的数据被威胁的功能上.Relational databases are used in an amazing variety of applications with co