一篇文章让你精通:java集合讲解(五,哈希表)(代码片段)

韶光不负 韶光不负     2023-01-30     591

关键词:

相信大家看过前面的内容后,对集合set有一定的了解,当我们重写定义对象时,要对对象的hashCode和equals方法进行重写。关于为什么我相信大家肯定和我有一样想法,所以小编此篇文章就来讲讲什么是哈希表。

哈希表原理

         当在无序数组中按照内容进行查找,效率低下,时间复杂度O(N),在有序的数组中数组中按照内容查找,可以使用折半查找,时间复杂度O(long2N),在二叉平衡树中按照内容进行查找,时间复杂度O(long2N),按照数组索引进行查找,不进行比较与计数,直接计算得到时间复杂度O(1)(索引的位置=起始位置+元素大小*索引)

问题:不按索引查找,按内容进行查找不进行比较与计数直接计算得到时间复杂度O(1)?

有,这个就是哈希表。通过跟给定的字值进行比较,来进行比较,效率取决于比较次数。(理想状态下就是比较一次时间复杂度O(1))需要记录存储位置与其关键字之间确定的对应关系,使每一个记录位置与关键字相对应。

哈希表的特点

hashtable,哈希表也叫散列表,特点:快,非常快

结构:存在这很多种结构,最流行与好理解的是:顺序表+链表

主结构,顺序表,每一个顺序表节点单独引出链表

哈希表是如何添加数据的过程(非常重要)

1,计算哈希码,不管内容加入什么,都通过计算得到一个整数

@Override
public int hashCode() 
        return Objects.hash(属性);
    

2,根据哈希码计算出在哈希表中存储位置(例如通过y=key(x)=x%11,根据取模安排在顺序表后面,如上图,x表示哈希码,key()表示函数“对应关系”,y表示存储位置)

3,存储进哈希表

进入哈希表情况
一次添加成功哈希表规则上没有,第一次添加成功
多次添加成功出现冲突,调用equals方法与对应链表进行比较,比较到最后都是false时,创建新节点并存储数据,添加到链表末尾
不添加出现冲突,调用equals方法与对应链表进行比较,比较到最后都是ture时,表明重复了,不添加

结论1:哈希表添加速度快(不考虑冲突情况下。三步就完成了),

结论2: 数据唯一并且无序

小问题:为什么重写hashCode就一定要重写equals方法?

原因:当我们重写hashCode方法后,当发生存储数据进入哈希表发生冲突时,我们就需要equals方法进行“比较”,来决定数据是否重复,选择添加或者不添加。

哈希表查询数据

与哈希表添加数据相同,

1,计算哈希码,

2,根据哈希码计算出在哈希表中存储位置

3,查找哈希表

查找哈希表情况
一次查找刚刚好查找的值在哈希表链表前面第一个位置
多次查找查找的值不在哈希表链表前面第一个位置,不是目标,equals方法向下查找直到找到
找不到查找的值不在哈希表链表前面第一个位置,不是目标,equals方法向下查找也没有找到目标

哈希表面试题

hashCode方法和equals方法有什么作用?

hashCode:计算哈希码,是一个整数,通过哈希码可以计算出数据哈希表中的位置。

equals:当添加出现冲突是,通过equals进行比较,看数据是否存在,同样在查找中使用判断数据是否正确

各种类型如何获取哈希码?

int:取自身(23-->23) (看 Interger 源码 )

double: 不可以取整 (看 double 源码,通过内部方法计算获取整 

String: 通过字符串位置与编码值进行计算(例abc:(31*(31*(31*0*97)*98)*99)  :a:编码值97,

b:编码值98,c:编码值99)

 对象:对每一个对象的成员变量的哈希码,通过相加相乘进行计算(与字符串差不多)

为什么哈希码计算复杂?

哈希码相同则存储的内容相同,当哈希码复杂,哈希码相同概率减小就增加了哈希表的添加与查找速度。

如何减少冲突?

冲突是避免不了的,我们只能够减小冲突。

装填因子:哈希表的长度与表中记录数的长度的比例(表中记录数/哈希表长度

当装填因子达到0.5(一般情况下取0.5)的时候,可以对主数组进行扩容。

方法:链表地址法,开放地址法,再散列法,建立公共溢出区。

一篇文章让你精通:java集合讲解(三,set)(代码片段)

一篇文章让你精通:java集合讲解(二,ArrayList)一篇文章让你精通:java集合讲解(二,LinkList)上面二个链接,让大家对集合中的List有了一定的了解,如果大家回想要继续加强理解,建... 查看详情

一篇文章让你精通:java集合讲解(练习处理)(代码片段)

紧跟上文,相信前面文章让你对集合有一定了解,下面让我们对集合进行案例讲解,让你能够更加了解与使用集合。问题一:找出下面错误的代码,并进行改正packagecom.luo_sf.map;publicclassTextpublicintgutIndexofArray(float[]f)i... 查看详情

一篇文章让你精通:java集合讲解(二,arraylist)(代码片段)

List集合主要的实现类是ArrayList与LinkedList,分别是数据结构当中的顺序表与列表实现。还包括了栈与队列的实现类。Deque与Queue。(数组中能放基本数据类型,也能放引用数据类型(对象)。集合中只能放引用... 查看详情

一篇文章让你精通:java集合讲解

在解答leetcode题时,自己做和别人做差距有一点大,特别是别人使用一行代码顶替我三行时,分析自己的集合学习太差了,所以自己开始复习与重新总结,让自己更加理解与精通哪里能使用集合当我们在存储大... 查看详情

一篇文章让你精通:java集合讲解(六,map源码了解)

相信大家学习了之前的内容对Map有了一定的了解,下面就让我们加深对map的了解,一起来看看hashmap,linkhashmap,treenmap的源码进行简单了解。 HashMap1,jdk1.7及以前,hashmap以一个数组加链表实现的存储结构 2,每... 查看详情

一篇文章让你精通:java集合讲解(二,linklist)(代码片段)

...!​​​​​​​​​​​​​​​​​​​​​一篇文章让你精通:java集合讲解(二,ArrayList)亲,可以先学习一下Arra 查看详情

一篇文章让你精通:java集合讲解(四,set)(代码片段)

一篇文章让你精通:java集合讲解(三,Set)_韶光不负的博客-CSDN博客书接上文,我发现如果一下子写太多东西,自己不好记,而且喜欢看小编文章的大大们也不好看,这怎么能行呢?可以辛苦... 查看详情

一篇文章让你精通:java集合讲解(六,map)(代码片段)

相信大家从头看过来,已经对前面List与Set有了一定的理解,下面我们就需要对集合中最后一个分类进行讲解Map,废话不多说,下面就让我们来看看Map有什么奇妙的地方吧!目录Map 分类HashMap:LinkHashMap(HashM... 查看详情

java集合哈希表及哈希函数的实现方式

Java集合(八)哈希表及哈希函数的实现方式一、哈希表非哈希表的特点:关键字在表中的位置和它之间不存在一个确定的关系,查找的过程为给定值一次和各个关键字进行比较,查找的效率取决于和给定值进行比较的次数。哈... 查看详情

第七节1:java集合框架之二叉排序树和哈希表

文章目录一:二叉排序树(二叉搜索树)基本概念及实现(1)定义(2)二叉排序树操作A:查找B:插入C:删除①:如果左子树为空②:如果右子树为空③:如果左右子树都不为空(3)二叉排序树实现二:哈希表(散列表)基本... 查看详情

一篇文章让你精通面向对象特征(封装,继承与多态)(代码片段)

在Java面向对象中有非常重要的三个属性,封装,继承与多态,让我们了了解了解它们的重要性吧!访问修饰符访问修饰符public公共的,在任何地方都可以正常访问,权限最大protected受保护的,同包和子... 查看详情

java源码阅读-linkedhashset(代码片段)

...HashSet,那么是否存在类似于LinkedHashMap原理的一种Set集合?答案是肯定的,而且是我们本篇文章要讲的LinkedHashSet顾名思义,LinkedHashSet是基于LinkedHashMap实现的一个Set集合。另外,本片文章虽然不长,但是对... 查看详情

一篇文章,让你精通css布局(flex布局)(代码片段)

相信大家在学习网页的时候都会感觉听着简单,但是做的时候总时做不好,盒子布局的宽和高,总时让你头大,下面我们就进入弹性盒子布局(Flex布局),编程网页更加容易吧1什么是Flex布局(弹... 查看详情

五redis源码数据结构之跳表skiplist

一、前言:有序集合SortedSet:底层数据结构跳表+哈希表typedefstructzsetdict*dict;哈希表--哈希表高效支持单点查询zskiplist*zsl;跳表--跳表高效支持范围查询zset;源码文件:t_zset.c-各种操作实现ser 查看详情

java示例代码_从哈希表中创建集合

java示例代码_从哈希表中创建集合 查看详情

java集合哈希冲突及解决哈希冲突的4种方式

Java集合(九)哈希冲突及解决哈希冲突的4种方式一、哈希冲突(一)、产生的原因哈希是通过对数据进行再压缩,提高效率的一种解决方法。但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈希函数... 查看详情

专栏文章目录索引

...定位查询Python系列ⅠPython网络数据爬取及分析「从入门到精通」「Python爬虫系列讲解」一、网络数据爬取概述「Python爬虫系列讲解」二、Python知识初学「Python爬虫系列讲解」三、正则表达式爬虫之牛刀小试「Python爬虫系列讲解」... 查看详情

第七节1:java集合框架之二叉排序树和哈希表(代码片段)

文章目录一:二叉排序树(二叉搜索树)基本概念及实现(1)定义(2)二叉排序树操作A:查找B:插入C:删除①:如果左子树为空②:如果右子树为空③:如果左右子树都不为... 查看详情