返回顶部
首页 > 资讯 > 后端开发 > JAVA >java中关于散列表的详细介绍
  • 705
分享到

java中关于散列表的详细介绍

java教程java散列表 2014-10-05 20:10:55 705人浏览 才女
摘要

什么是散列表散列表,也叫作哈希表(Hash Table),是一种提供键(Key)和值(Value)的映射关系的数据结构,只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近于O(1)。在线学习视频推荐:java视频散列表

什么是散列表

散列表,也叫作哈希表(Hash Table),是一种提供键(Key)和值(Value)的映射关系的数据结构,只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近于O(1)。

e419b45d76fbab9af429bb1a2369216.png

在线学习视频推荐:java视频

散列表的工作原理

散列表在本质上是一个数组。我们知道数组可以根据下标来进行随机访问,如a[0], a[1], a[2], a[3], a[4],通过这样来访问,因此其查询效率非常高。而在散列表中,当我们给出一个key的时候,也能立即查询到对应的value。这时我们就需要一个“中转站”,通过某种方式,把Key和数组下标进行转换,而这个中转站就是哈希函数。

839e0a0e425812541792c58e9cf363d.png

不同的语言中,哈希函数的实现方式是不同的。Java中使用的是HashMap

在Java及大多数的面向对象的语言中,每个对象都有属于自己的hashcode,用以区分不同的对象,而这个hashcode是一个整形变量。此时我们就需要将这个整形变量转化成数组的下标,最简单的转化方式是对数组长度进行取模。

公式如下:

index = HashCode(key) % Array.length

举个例子:

给出一个长度为8的数组,我们要查找key为"001121"所对应的Vaule,而"001121"的hashcode为1420036703,那么就可通过下面的计算先得到数组下标:

index = HashCode("001121")%Array.length = 1420036703 % 8 = 7

散列表的读写操作

1.写操作

写操作就是在散列表中插入新的键值对(jdk中叫做Entry)。

具体的做法是:通过哈希函数将key值转化为数组下标,然后在数组的该位置处插入Entry(注意是Entry键值对Key+Value,而不仅仅是Value)。可想而知,不同的key值可能会转化为相同的下标,那么此时就成为哈希冲突。

解决哈希冲突常用的方法是开放寻址法和链表法。

开放寻址法的基本思路是:当发生哈希冲突时,就把Entry放到下一个数组中为空的位置,也就是逐个往后移动。

链表法(应用在Java的HashMap集合类中)的基本思想是:数组中的每个元素不仅是一个Entry对象,同时也是一个链表的头节点。每个Entry对象通过next指针指向它的下一个Entry节点。当新来的Entry对象映射到与之冲突的数组位置时,只需要插入到对应的链表中即可。

4fda9070d54bd388af9487b0fbf72bb.png

2.读操作

读操作与写操作对应 ,只需特别处理冲突情况即可。

具体的思路为:通过哈希函数,将待查找的Key值转化为数组下标,然后检查数组中该位置的Key值是否为我们要找的Key,若是,则找到,可以返回该Entry的Value值;否则,沿着链表继续往下查找,看有没有对应的Key值。

例如,我们要查找Key为002936所对应的value时,先将Key转化为数组下标,得到下标为2,检查该元素,发现该元素的Key为002947,不是我们要查询的Key,那么继续沿着链表往下查找。

69e8c5ecdab3b0f094a8c85a0e56d45.png

3.扩容

我们知道数组扩容,是当数组中的元素个数达到数组的最大长度时需要对数组扩容,那么散列表什么时候扩容呢?

当经过多次元素插入,散列表达到一定的饱和度时,发生哈希冲突的概率会变大,此时大量的元素拥挤在相同的数组下标位置,这对后序的插入和查询操作的性能产生很大的影响,此时就需要对散列表扩容。

影响散列表扩容的因素为:

Capacity,即HashMap的当前长度

LoadFactor,即HashMap的负载因子,默认值为0.75

扩容需要满足的条件:

HashMap.Size >= Capacity X LoadFactor

简单解释为:当哈希表中的条目数超出了当前容量与其加载因子的乘积时,并且要存放的位置已经有元素了(哈希碰撞),这两个条件满足时,需要进项扩容,会将容量扩大为原来的两倍。加载因子默认值0.75,是在空间和时间上的一个折中,加载因子过高(发生冲突可多存放在链表),虽然减少了空间成本,但也增加了查询成本。

扩容的步骤:

扩容不是简单地把散列表的长度扩大,而是经历了下面两个步骤:

扩容,创建一个新的Entry空数组,长度时原数组的2倍;

重新Hash,遍历原Entry数组,所有的Entry重新Hash到新数组中。

经过扩容,原本拥挤的散列表重新变得稀疏,原有的Entry也重新得到了尽可能均匀的分配。需要注意的是,关于HashMap的实现,JDK8和以前的版本有着很大的不同。当多个Entry被Hash到同一个数组下标位置时,为了提高插入和查找的效率,HashMap会把Entry的链表转化为红黑树这种数据结构。

相关文章教程推荐:java语言入门

--结束END--

本文标题: java中关于散列表的详细介绍

本文链接: https://lsjlt.com/news/4166.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java中关于散列表的详细介绍
    什么是散列表散列表,也叫作哈希表(Hash Table),是一种提供键(Key)和值(Value)的映射关系的数据结构,只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近于O(1)。在线学习视频推荐:java视频散列表...
    99+
    2014-10-05
    java教程 java 散列表
  • 关于java中的Lambda表达式的详细介绍
    什么是lambda表达式?lambda表达式是一个可传递的代码块,可以在后面执行一次或多次。推荐java相关视频教程:java学习视频例如:class action implements ActionListener{ @Override...
    99+
    2016-04-10
    java入门 java lambda表达式
  • java中关于对象的详细介绍
    一、对象的创建步骤:(1)声名对象变量:对象变量的声明并没有创建对象,系统只是为该改变量分配一个引用空间。(2)对象的实例化:为对象分配空间,执行new运算符后的构造方法完成对象的初始化,并返回该对象的引用。过程:首先为对象分配内存空间,并...
    99+
    2014-08-23
    java入门 java 对象
  • java中关于scanner类的详细介绍
    1.Scanner的实现步骤第一步:在有效代码的第一行,通过import导入Scanner类!import java.util.Scanner;第二步:通过new关键字实例化一个Scanner对象!Scanner input = new S...
    99+
    2019-01-24
    java入门 java scanner
  • 关于java泛型的详细介绍
    Java泛型泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 比如我们要写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,...
    99+
    2021-04-27
    java入门 java 泛型
  • Python中的列表详细介绍
    本篇内容主要讲解“Python中的列表详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的列表详细介绍”吧!Python中的for循环Python中的for循环语句按顺序遍历任...
    99+
    2023-06-16
  • java中关于工厂模式的详细介绍
    工厂模式分类:1)简单工厂模式(Simple Factory)2)工厂方法模式(Factory Method)3)抽象工厂模式(Abstract Factory)相关视频教程推荐:java学习简单工厂模式简单工厂模式又称静态工厂方法模式。重...
    99+
    2017-01-12
    java教程 java 工厂模式
  • 关于java中类和对象的详细介绍
    类和对象对象我们知道,代表现实世界中可以明确标识的一个实体(万物皆对象),每个对象都有自己独特的标识、状态和行为。类是具有相似特征和行为的事物的统称。使用一个通用类来定义同一类型的对象。 类是一个模板 、蓝本或者说是合约 , 用来定义对象的...
    99+
    2015-06-07
    java入门 java 对象
  • 关于java中的常用类——String的详细介绍
    概述java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如"abc")都可以被看作是实现此类的实例String 中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻译为大写...
    99+
    2014-10-10
    java基础 java 常用类 String
  • java中有关于jar包操作的详细介绍
    为什么用jar包、什么是jar包.java文件编译好后生成.class文件,如果直接写在其他程序或提供给别人使用会很不方便,因此将一些.class文件打包成一个jar包,jar包中还可以包含一些资源文件(如txt文件、html文件、css文...
    99+
    2017-08-02
    java入门 java jar包
  • Redis List列表的详细介绍
    Redis List列表的详细介绍 Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (42949...
    99+
    2022-06-04
    详细介绍 列表 Redis
  • 关于java中变量命名规范的详细介绍
    Java是一种区分字母的大小写的语言,所以我们在定义变量名的时候应该注意区分大小写的使用和一些规范,接下来我们简单的来讲讲Java语言中包、类、变量等的命名规范。(一)Package(包)的命名Package的名字应该都是由一个小写单词组成...
    99+
    2019-10-05
    java入门 java 变量 命名规范 介绍
  • Java中关于Collections集合工具类的详细介绍
    Collections 是一个操作 Set、List 和 Map 等集合的工具类。 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集...
    99+
    2024-04-02
  • 关于MySql知识的详细介绍
    下文主要给大家带来关于MySql知识的详细介绍,希望这些内容能够带给大家实际用处,这也是我编辑关于MySql知识的详细介绍这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。    ...
    99+
    2024-04-02
  • 关于redis命令的详细介绍
    小编给大家分享一下关于redis命令的详细介绍,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!              &...
    99+
    2024-04-02
  • 关于java中继承类的权限问题的详细介绍
    在Java中有一个比较容易忽略的问题,那就是继承类的权限与基类的权限之间的关系。因为平时在使用继承类的时候,可能很少会需要到修改基类的访问权限控制符,而是直接使用基类的访问权限控制符。如果基类有属性方法是private的,那么子类是否可以修...
    99+
    2019-09-11
    java教程 java 继承类 权限
  • Python列表list的详细用法介绍
    目录一. 创建列表1.1 第一种1.2 第二种二. 查询列表2.1 获取列表元素索引2.2 获取列表单个元素2.3 获取列表多个元素2.3 判断元素是否存在于列表三. 列表添加操作四...
    99+
    2024-04-02
  • 关于Flask上下文详细介绍
    目录1、上下文概念2、Flask中的上下文2.1请求上下文2.2应用上下文 1、上下文概念 上下文,说白了就是所谓的语境,就是语言环境。比如单独拎出来一篇文章的某一句话,我们可能不能...
    99+
    2024-04-02
  • Java关键字null的详细介绍
    本篇内容主要讲解“Java关键字null的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java关键字null的详细介绍”吧!一、null是代表不确定的对象Java中,null是一个关键...
    99+
    2023-06-17
  • Java关于List集合去重方案详细介绍
    1 常规去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素。 // 遍历后判断赋给另一个List...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作