欢迎您访问广东某某机械环保科有限公司网站,公司主营某某机械、某某设备、某某模具等产品!
全国咨询热线: 400-123-4567

哈希游戏

哈希游戏| 哈希游戏平台| 哈希游戏官方网站

haxiyouxi-haxiyouxipingtai-haxiyouxiguanfangwangzhan

hashcloud干嘛的哈希游戏- 哈希游戏平台- 官方网站

作者:小编2026-01-20 11:03:05

  哈希游戏- 哈希游戏平台- 哈希游戏官方网站

hashcloud干嘛的哈希游戏- 哈希游戏平台- 哈希游戏官方网站

  接下来我们要讲一个很重要的知识点,叫哈西。哈西是一类算法,注意我的用词,我说的是一类算法,不是一种算法,它有很多种算法,算法其实就是功能吗?我们可以把它看成是一个函数, 然后可以给他传一段内容,他经过运算之后会返回一串哈系直。当然也有人叫散劣子,叫什么都没关系,我们这里就称他为哈系直了,他就是一串之无串。常见的哈系算法也名第五、 sha、 一二五六五幺二等等, 他们的功能都是一样的,只是算法的复杂程度不一样。不过现在 md 五和 sha 已经被破解了,我们要用的话至少要用 sha 二五六。至于这些算法背后是怎么实现的,我们就没必要关心了,因为这是一道很多的数学知识,我们并不是研究数学的。现在我们需要关心的是这个哈西子他有什么特点? 他的第一个特点就是输入敏感,只要我们输入的内容发生任何一丁点变化,哪怕你只改了一个标点符号,新的哈蝎子,都会出现 巨大的变化。如果我们输入的内容一样,使用的哈吸算法也一样,那得到了哈吸值也一定是一样的。而哈吸值的第二个特点是不可逆,就是说我们不能根据哈吸值反对出来传输的内容是什么。再来看第三个特点,计算极快而长度固定, 一部十个 g 的高清电影和一个是 kb 的文本文件,都可以在零点一秒内得出结果。也就是说,不管你长得有多胖,骨头有多硬,对于火葬场来说,把你化成灰都是一把火的事情,而且只要采用的哈西双法一样, 返回的哈系直的长度也都是固定的,假如十个 g 的文件算出来的哈系直长度是三十二,那十 kb 的文件算出来的哈系直长度也是三十二。然后我们再来看哈系算法有什么用途, 前面我们说对于同一个哈气算法,输入的内容只要不变,得到了计算结果也不变,这就可以拿来做密码加密了。现在我打开 qq 的登录界面,然后我在这里输入账号,输入密码,这时候当我们点击登录之后,这个 qq 的客户端就会把我们输入的账号密码连着网络传输到 qq 的服务端去,然后服务端再做判断,判断我们输的账号密码对不对,如果对上了就让我们登录成功。但是你有没有想一个问题,只要我们的数据通过网络传输,那我们这个数据包就有可能被别人捡获到。我们现在还没学网络相关的知识,我就简单发个图给你看。 这是 qq 的客户端,然后这是 qq 的服务端,当你点击登录之后,你的账号密码就会沿着网络传输到服务端,而我这时候作为一个攻击者,我就从这中间把你的数据包给截取到,截取到之后我一看发现居然是明文的账号是六六六,密码是一二三,然后我就可以登录你的账号了。

  cash map 知多少?首先,哈西 map 是基于哈系表的 map 接口的非同步实现,该实现提供所有可选的映射操作,并允许使用空作为 k 和 y 留的值。此类不保证 更奢的顺序,特别是他不保证该顺序很久不变。其次呢,哈西麦婆实际上是一个链表散裂的数据结构及数组加链表的结合体。当我们往哈西麦婆当中 铺的元素的时候,首先根据 t 的哈西扣的重新计算哈西值,根据哈西值呢得到这个元素在数组当中的位置,那么如果该数组在该位置已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的呢?放在链头,最后加入的放入链尾。如果数组中该位置没有元素,就直接将该 元素放到数组的位置上。但是 gdk 一点八当中对哈西麦的实现是做了优化的,当列表当中的节点数超过八个之后,该列表就会转为红黑数了,来提高查询效率。从原来的 on 到 ologan, 欢迎大家在评论区补充其他的内容吧。

  深入理解哈西卖铺与哈西算法,首先我们来讲一下哈西卖铺的数据结构,在 java 七以及 java 七以及以前,哈西卖铺的底层是数组加列表,像这样的 默认情况下面的元素放在数组上,如果说他们中间发生了哈西冲突,也就是说在一个数组上面,我要插多个元素,他就会形成这样的一个单列表,这就是哈西麦普 gdk 一点七以及以前他的数字结构。那么到了扎瓦八中间之后的话呢,除了数组和列表之外,他还加入了鸿飞数,也就是说 如果链表的长度过长,他在一定条件下面可能会转换成一棵红黑树。那什么情况下面链表会转换成红黑树呢?他要满足的条件就是第一个链表的长度必须要大于八,就是这个长度必须大于八。然后与此同时还要注意一个点,就是他还需要满足第二 条件,就是数组的长度必须要大于等于六十四,也就是说默认情况下面,你又出来的,又出来的这个哈西迈普,他的数组是六十四,是一十六个长度,对不对?这个地方你要经过两次扩容变成六十四之后,当列表的长度大于等于八了之后, 那么这个链表才会转成红黑树,才会转成这个样子,否则的话呢,他只会触发哈西麦普当中数组的扩容,也就是说他仅仅只会把这个数组呢进行乘以两倍, ok, 所以呢,这就是链表 什么情况下面会转成同回数?要注意了,是有两个条件的,不单纯是列表大于八,还要满足数组的长度呢,他一定是要大于等于六十四, ok, 好,我们再来讲一下哈西卖谱当中的哈西算法,其实要讲清楚哈西算法的话,我们必须要去讲他的 pow 的方法和 get 方法,但是不 管是哈西卖部当中的扑特还是他的 get, 他的流程是类似的,比如说第一步先根据 t 值来计算出哈西值,然后第二步根据这个哈西值来算出这个数组的下标, ok, 然后的话呢再进行对应的,比如说插入,插在数字上面,或者插在列表上面,或者插在横汇数上面, 或者是进行对应的查询,所以呢,这就是哈西卖部当中的一个库的 get 方法,他的一个流程。那么我们来看一下,在这里面呢,他就会涉及到两个算法,第一个的话呢,就根据 k 来计算哈西,第二个话呢,根据哈西来算出数字的下标。 首先在原码当中,我们来找一下根据 k 计算出哈西的这种方法,那么这个 k 呢,是个入餐对不对?然后的话呢,你会发现它里面进行了一个三目运算,如果这个 k 等于空,直接返回一个零, ok, 如果说他不为空,那么首先拿到这一个 他的哈西克的值,拿到之后再做一个处理,把这个值呢付给 h, 然后呢再用 h 这个本身对不对?和这个 h 向右无符号位一十六位做一个优惠运算,最终得到一个改进型的哈西阔的, ok, 然后这就是根据 t 怎么去算哈西?这是第一个算法,然后第二个算法的话,你会发现啊,他在根据这个哈西值再来去算出对应数字的下标,也就是说我得到这一个哈西值,然后的话呢,再去 跟这个 n 减一,进行一个雨计算,也就是说我们得到的哈西值再跟这个 n 减一,进行一个雨计算, ok, 这样呢得到一个对应的数组下标,那么这个 n 是什么呢?这个 n 是为数组的一个长度,那么为什么他可以算呢?我要讲一下,因为 这么去运算,他的效果其实跟哈西值去个 n 曲模他是一样的,但是他满足的条件就是必须这个 n 是二的次方,当然在哈西卖部当中 他是二的四方,所以呢这样的运算他的效果是一样的。与此同时的话,因为他是个雨计算,看到没有,在计算机里面雨计算他的运算速度一定比我们的这种曲模运算他的效率要高,所以这种算法效率更高。好,这是第一个点, 第二个点就是在 gdk 一点八当中,为什么要采用这么复杂的哈吸值的计算方法呢?明明你通过一个 k 直接调用哈吸扣的方法可以拿到一个哈吸值,为什么还要采用这样的运算呢? 其实原因很简单,就是为什么哈西卖普要把哈西扣的做一个改进,就是让他算出的数组下标更加分散,就是让我们算出了这个哈西值,然后再经过数 下边的运算,他得出的结果会更加的分散。原因是什么呢?我们来看一下。如果说我们就不进行这种运算,我们拿到一个哈西扣的,然后拿到这个哈西扣的之后,我们再跟 n 减一,进行一个语计算, n 是什么? n 是 数字的长度对不对?比如说数字的长度是一十六,那么这个情况下面呢,他 n 减一,他就是一十五,然后用二进去表示就是四个幺, ok, 然后高位全是零,你们进行一个语句算的时候,大家发现没有, 这个哈西值得出的数组下标,他只跟低位有关,就是你这个哈西值的高位,其实他不会去参与到我们数组下标的运算,也就是说如果你不对这个哈西扣的进行改进,那么这种 n 减一与上哈西的这种计算数组下标的 方式,他始终会导致很大的哈西通途,因为你有可能计算出来了哈西值,对不对?明明他的低位都是相同的,只是高位不同,于是高位很多的东西不同,那么低位只要第四位,第五位相同,那么他们算出的数组下标一定相同,所以这样的情况呢,就不利于哈西分散, 所以的话呢,在哈西卖普里面就用这样的方式进行了一个改进。怎么改进的?首先把这个哈西扣的复制给 h, 好,那么我们得到一个 h, 那么大家知道啊,这一个哈西扣的他是一个三十二位的,那当然有低一十六位和高一十六位,对不对?这个时候呢,我们再把这个 h 向右无符号位于一十六位,得到一个另外的结果,那么你可以发现这个 h 向右边无符号位于一十六位,就相当于是往右边推进,那相当于是把这个高一十六位,把它放到这 第一十六位,对不对? ok, 然后的话呢,这个高位就补零,然后他们中间再来完成一个预后运算,也就是说通过这种计算比较均匀的预后运算,最终会得到一部分影响数组下标的这样的一个哈西值, 所以你发现这样的一个算法的改进的话呢,他就会会让这种高一十六位也会去参与到影响数组下标运算的这些低位的这个哈西值里面来。 如果说你不采用这样的运算,那么你的数组下标了可能会更加的什么有哈气冲突。如果我采用了这样的运算,那么高一十六位他也可以去参与我们的这个数组下标的计算的一个影响,所以他会让我们的下标计算 更加的分散,所以这就是哈西卖部当中他对哈西 coat 做的一个算法改进。

  哈西 map 和哈西 table 的区别以及呢底层实线是怎么样的?那么这道题呢,其实是一道呃, 时间比较久的题啊,就是说经常会问,对吧?但是说实话,这道题呢,已经比较的 out 了啊,为什么呢?因为这个哈西泰国了,已经不怎么用了啊,但是问这问这个题目的这个 意图啊,其实还是为了考察我们程序员这个知识面对不对,以及呢,我们对这个县城安全跟县城不安全这一块掌握到底怎么样啊? 最主要的其实还是基于这个底层实现,也就是说这个卡西 map 他这个底层到底是怎么实现的?前面的这个区别呢?其实很简单,对不对? 因为卡西迈普啊,跟卡西太伯他里面的方法其实都都差不多啊,而卡西迈普最主要的区别就是这个卡西特普里边的每一个方法都是加了一个生姜耐子的,都加了一个生姜耐子,而这个卡西迈普里边呢?没有, 所以呢,卡西太薄了,他是现成安全的,而哈西卖不是现成不安全的,也就是说当这种东西,你把它作为一个共享变量用 啊,放在我们的程序里面,作为一个共享变量,那么他在多线程环境下面,他的这个执行结果啊,这个卡西迈普他在多线程环境下面,他这个执行结果,那么呢,跟单线程执行结果呢?他是有可能会出现不一样,这个就叫做线程不安全啊,而哈西推国他不会啊,他不会。那么呢,那你多线程执行跟单线程执行呢? 他的结果肯定都是一样的,因为他里面的每一个方法都加了数啊,原因就这样,那么呢,所以呢,这个卡西太宝他的这个效率呢,很低啊,所以也是为什么我们现在呢不怎么用他的原因,而是用另外一个类叫坑卡人的卡西麦宝啊, 当然这个是后话啊,那么所以呢,回答这个问题啊,我们最主要的还是要基于这个底层实现啊,我们来看一下,好,前面呢,我简单的 写了一下啊,当然还有一个很很小的一个区别,就是卡西麦不能允许这个 k 和歪柳了,为闹哈西太婆不允许啊, 好,然后那个底层实现呢,这个是我们最重要的部分,那么这个卡西麦普的底层呢,实际上是采用数组加链表来实现的 啊,其实这个问题呢,呃,康飞老师,以前啊,在面试的时候,其实发现呢,有很多同学啊,在问到这个哈西迈步提成原理的时候,哎,数组加链表都知道,都能够打出来哎,但是仔细去问, 这个数组加链表到底是怎么回事,到底是数组还是链表,数组存什么?链表存什么?这个时候呢,很多人就懵逼了,不知道到底是怎么回事,就知道,呃,就会说一个数组加链表到底怎么回事呢?说不清啊,我们仔细来看一下, 那么这个 jdk 八呢,其实实际上呢,有一点点改变啊,就是在这个链表高度达到八的时候,数组长度超过六十四,链表呢就会转化为红黑数,这个点呢, 要注意一下,在 gdk 八的时候,在面试的时候回答这个问题的,最好把这个点提一下啊,展示了你对这个 gdk 的这个啊,这个升级了,是有这个关注在这里的啊,对,这个技术更新,对吧?保持一定的这个关注啊, 然后呢这个元素啊,在这个卡西麦内部是以这个漏的节点存在的,跟我们的那个拎格的历史人啊有点相像啊,就是唯 酷了一个,累不累,对吧?有一个漏的节点,那么这个漏的节点呢?实际上一看到这个漏的节点,我们就要想到列表,对不对?那么也就说元素在这个卡西迈普内部是以漏的节点存在的,然后这个漏的节点实际上就是我们的列表,对不对?哎,那这个数组在这里是干什么用的呢? 好,我们来看一下他纯元素的就是这个步骤啊,纯元素的这个步骤,首先呢他会计算一下这个 p 的一个哈气值,我们知道卡西麦虎最最明显的一个特征就是 py 纽结构,对不对?那么他是怎么样来做的啊?首先呢计算这个 k 的一个卡西值啊,就是一个卡西扣的,计算他的一个卡西值, 然后呢根据这个卡西值了,在二次卡西啊,记得这里呢有两次卡西啊,二次卡西。然后呢对数组的长度去取模,首先呢这个卡西面里面会维护一个数组,我们知道数组呢肯定有一个长度的,对不对?有一个长度,比如长度是十, 然后呢根据这个哈系扣的对这个数组的长度去进行取模,那么取完模之后,这个肯定呢就定对应到了一个数字,这个数字呢肯定比十要小,对不对?你比十要小,那么对应到的这个数字呢,就是这个数组的一个下标,对应到这个数组的下标啊, 那么如果说这个下标位置,这个数组的这个下标位置啊,我们来看一下,比如说这个数组啊,这个数组,如果说我计算出来的这个哈气扣的对应的这个下标位置,比如说是这个位, 那么这个时候呢,他就要判断一下这个位置上呢有没有元素,这个位置上有没有元素,如果说这个位置上是个空的,那么直接就放在这个位置,这个时候有链表,没有,没有链表,注意没有链表了,这个时候我就直接把这个元素往这里放 好,那么如果说我计算出的这个卡西扣的这个位置上已经有元素了,怎么办呢?这个位置上如果已经有元素了啊,那么这个时候才会出现列表,就是说产生了卡西冲突,意味着我这个地方呢,计算出来这个卡西值了,跟原来的这个元素的这个卡西值是一样的,对不对?因为你算到了同一个下标啊, 所以呢说明了产生的卡其中路。然后呢再进行一个一口子比较啊,看他这个一口子是否相同,对不对?那么如果一口子相同的话,意味着呢?我们 按照我们程序员这个实现的这个一口子方法啊,当然这个一口子如果你没有重写的话,那么就是双等比较,双等于号啊,如果你重写了, 按照你的逻辑来,那么如果说按照一口子比较,这两个元素如果是相同的话,意味着什么?意味着这两个元素呢?是同一个元素对不对?相等的元素啊,是一个相等的元素,他对指指向的同一个对象,那么这个时候呢就要取代该元素,也就是说这个 t 值 就是我们的哈西麦部的中的一个 t 值重复了,对不对? t 值重复了怎么办?取代直接覆盖啊,这也就是说卡西麦部里面为什么我们放一个相同的 t 值进去啊?这个外流值直接会覆盖,原因就在这里啊, 那么如果说要是不同的话,那么如果说这个一口子比较,哎,发现你卡西扣的虽然一样,但是我一口是来比较的,发现他的这两个对象呢不是相等的,那么这个时候怎么办呢?这个时候就出现了,我们这个列表出现了,列表 就在这个地方呢,维护一张链表啊,那么呢把这个元素呢往这个链表上面去放,这样啊,维护一个链表, 把这个元素呢放到这个链表上面,那么这个时候就是我们的哈西内部的这个数组加链表,那么然后当这个链表 越来越长,越来越长,也就说这个卡其中度越来越多,越来越多的时候,当这个链表呢达到了一定的高度的时候,我们知道这个链表的话,如果很长的话,他这个便利的 这个效率呢是非常之低的啊。那么我们在发现面部中我们如果去查询一个值,对吧?我们去 get 啊,去去 get 一个 k 的时候,那么 get 一个 k, 如果 get 到这个位置这个 k 呢?哎,发现这个列表上有这么多元素呢,我这个 k 到底对应的是哪个值呢?这个时候就需要去便利一个一个元素呢?去一口死比较,对不对?一个一个元素去一口 比较焊的到底是哪一个 k 好?焊的是到底是哪一个值啊?这个 k 到底是哪一个好,那么这个呢,如果列表很长很长的话,那么这个便利的这个效率呢,就相当之低啊,它是一个线性的对不对?一个线性的啊,那么这个时间复杂度呢,就 比较的高啊,这个时候就采用了红 k 树接地 k 八采用红 k 树,因为我们知道红 k 树了,是一颗平衡二叉树,对不对?平衡二叉树,那么他的这个茶型效率呢,是比较有保障的。那么这个时候呢,把这个链表呢啊, 换成一棵红黑树存在这个地方,这个时候链表就不存在了,不存在了,然后呢,这个这个地方呢,存的就是一个链表了啊,这个树主下边这个位置 存的是一个链表哎,存存的是一个红 k 数,存的是一个红 k 数啊,这个就是这个链表啊,就是变化成红 k 数的一个呃过程,当然呢,当这个红 k 数这个节点呢,数量逐渐减少之后,他呢又会退化成链表,又会退化成链表啊,他还会有一个退化的过程啊,所以呢,这个就是我们这个 卡西迈普的这个底层的这个原理啊,我们看一下长度低于六的时候啊,将红黑数转回列表就退化成列表啊,那么如果说 t 要是维纳的话,我们卡西迈普是可以 以存储这个 k 为闹的,值得,对不对?那么 k 要是为闹了,直接放在下标为零的位置,也就是我们在这个数组里面,这个下标为零的这个位置放置这个 k 为闹的值,那么这个呢就相当的方便啊,那么你这个 k 如果为闹的话,那么直接呢就可以取出来的啊,这个是比较方便的,因为这个闹了,我们 啊不太好去对他进行这个卡西扣的,对不对?不太好去进行这个闪电算法好,那么这个呢,主要就是这个卡西扣的底层的这个呃,实线啊, 当然他还有一个数组扩容,那么这个数组扩容呢,其实就跟我们这个阿瑞利斯特里面的这个数组扩容是一样的啊, 因为呢这个数组呢,在我们加瓦中数组是一个静态数组啊,这个数组呢,你一经定义,一经扭出来,扭了一个数组之后扭了一个数组,对吧?比如说我们又一个数组,那么这个数组的长度呢?就定死了,而我们知道这个卡西迈步呢,是可以就是一直往里面放直的,对不对?一直会 可以往里面放直,当然你不能超过这个,呃,最大长度啊,就是我们的这个硬头的最大值啊,那么如果说我这个数组一定义出来,那 那么长度定死了,这个数组是不可以再往里面放元素的,对不对?你再放元素呢就下标越界了,那么这个时候呢,就有一个叫做数组扩容机制,数组扩容是什么意思呢?就是说如果当这个数组长度只有十个,我现在呢要放第十一个元素怎么办?那么呢重新又一个数组,重新又一个数组啊, 又一个速度,然后呢把这个长度呢直接了变大,你产之前不是十吗?那么我现在比如说我给一个十五,或者说给一个二十,那么这个是 就基于这卡西面部底层的这个啊扩容因子啊,那么呢给他一个新的长度,然后呢把老的这个数组里面的数据呢,把他移到这个新的数据里面来啊,然后呢把你新的这个元素呢放到这个十一这个位置,可能这个就是数组扩容啊,这个呢?呃,那么以上呢, 就是这个卡西麦这个底层的一个插数据的一个过程,以及查数据的一个过程,以及到他底层破笼的这个原理啊,那么掌握了一项以以上知识的话,那么呢这卡西麦普跟卡西 table 这道题呢,应该是可以啊,做出一个比较满意的一个回答。

  有假发,我自信。这一期我们来说说 jdk 一点八中的 hasmap 的扩容机制。首先我们来看看 hasmap 的初始容量, hashmap 如果使用默认的方式创建,默认的初始容量是十六,如果我们指定了初始容量,比如指定为二十四,实际上 hasmap 会通过计算得到一个 大于等于二十四的二的整次秘书,三十二作为初始容量。为什么呢?因为二的正次秘书有统一的规律,可以通过为运算快速的计算出元素的,所以关于所以的计算在上一个视频中已经讲解过,这里就不再坠述。接下来我们来看看 hex map 扩容的情况。 hex map 在两种不同的情况下会扩容。第 第一就是元素个数到达了扩容的预值,这个扩容的预值是通过容量和负载因子计算的,默认的负载因子是零点七五,也就是说如果数组长度是十六,那么扩容的预值就是十二。如果数 数组的长度是三十二,那么扩容预值就是二十四,当然这个预值也是有最大值的。这部分后面再说。了解到这里,也就是说第一种扩容的情况就是当元素个数超过了当前的扩容预值,就会将数组扩容。那么接下来说第二种扩容的情况,在还是 map 中有一个最小数化容量 确认值是六十四。假如数组的某个位置上的链表个数到达了八个,但是数组的长度还没有到达六十四。 hash map 不会竖画这个链表,而是对数组进行扩容。这也是上上个视频中有朋友说我讲的有问题的部分。继续说 hash map 如何扩容?如果需要扩容, smap 会对原有的容量和扩容预值进行左移一位的运算,其实就是翻倍。根据新计算出来的容量值和预值创建新的数组,然后将原来数组中的所有元素重新计算位置,并且移动到新的数组上 对应的位置。当数组的长度大于或者等于六十四之后,如果某个列表的元素到达八个 hash map, 就会将这个列表转换为红黑数,当少于六个的时候又会转换为列表。继续说说 hash map 的容量上限。 house map 定义了一个最大的容量值 2 的 34 方,当数组的容量超过或者等于 2 的 34 方时,扩容的预值会直接设置为整形的最大值,也就是 2 的 31 次方减一。当然到达最大值的时候还是 map 也不会再扩容了。可能有人要问,不再扩容, 如果元素过多怎么办?其实一般情况都是还没有到最大值,内存就一出了。如果真的到达了最大值,并且数组所有位置都不为空,那么就是继续给对应位置上的列表或者红黑数继续添加新的节点,这就是 jdk 一点八中还是 map 的扩容。

  来看一下这道面试题,卡西扣的与一口四,那么这道题呢,考察的也是程序员的这个基础了,掌握是否扎实。 要想回答好这个问题,首先呢等明白这个卡西扣的是什么,一口词是用来干什么用的?那么首先呢,我们先来解释一下一口词啊,一口词的话,其实呢是这个 加瓦提供给这个程序员用来定义啊,就是我们在对比两个对象的时候啊,对比两个对象,这两个对象什么时候是相等的,什么时候是不相等的,那么用什么规则来定义,那么就是这个一口词方法, 我们呢可以去重写这个一口子方法来定义了这两个对象的一个对比规则,就是按什么样的规则去对比来判断呢?这两个对象是否相等啊,那么这个一口子,我们如果说不去做做重写啊,你如果不去 重写,那么默认呢,采用的是 object 中的这个 equals, 那么 object 中的 equals 呢,实际上就是我们的双等于号啊,就是我们的双等于号,它对比的呢就是这个对象在占中的这个引用地址,那么如果是基本类型变量的话,对比的就是占中的这个值啊,对比的是引用地址, 那么一般来说呢,我们的这个对象呢,通常,呃,比如说我们的思俊啊,他呢就会去重写这个 e 口词,还有呢,像我们普通的这个对象啊,如果说你想让他在对比的时候,你想只对比这个成员变量,而不是去比他的这个对象地址 的话,那么你也可以去重写这个 eq 四啊,去定义这个对比规则,那么卡西扣的又是什么呢?卡西扣的啊, 那么卡西扣的的解释了,我们来看一下这个笔记啊,那么卡西扣的呢,实际上呢,他是一个哈西马啊,也称作为散练马。那么在我们 夹瓦中的这个卡西扣的这个方法,实际上就是用来了获取这个卡西马啊,或者是说闪念码。那么卡西扣的这个方法呢,他是定义在这个 jdk 的这个 opple 这个的这个类中的啊,他是一个 led 五方法,是一个本地方法啊,那么他呢会返回一个硬的型的一个整数,会返回一个硬的型的一个整数啊, 他是什么作用呢?实际上在我们加瓦中这些对象啊,这个对象是放在存在我们这个堆中,对不对?那么在堆中怎么样去找到这个对象在堆的哪一个位置呢?那么这个时候 实际上是维护了一张哈西表啊,这个哈西表中的这个锁影就是我们的这个卡西扣的啊,那么通过这个锁影呢,可以很快的去从这个卡西表里面找到我们这个对象在这个堆中的这个存储位置啊,也就是说这个印的值,这个印的整形就是这个锁影啊,那么 我们家伙有了这个锁引之后,他就可以很快的啊,在这个哈系表中就去找到这个对象在堆中是什么位置,然后马上就可以把这个对象呢给取出来啊,那么这个 欧不借口的中的这个卡西扣的了,那么他定在欧不借口的中,所以呢,加瓦中的任何类他都包含了这个卡西扣的函数啊,不管你有没有显示的去啊去重写,对吧?那么这卡西扣的函数呢?他都是有的啊, 其实这个散列表中呢,存的就是一个 p y 扭直啊,就是我们的锁影嘛, k 就是我们的锁影啊,那么它主要的作用就是能够了帮助我们快速的检索出了这个对应的一个值啊, 好,那么为什么要有这么一套机制了?这套机制到底是干什么用的啊?这个卡西购的为什么需要从这个啊?就是利用这个锁影快速的找到这个对象,有什么用呢?我们来看一下啊,以这个卡西 cet 啊,如何检查重复, 用这个例子,我们来来来解释一下这个卡西扣的存在的一个意义啊,那么呢,我们都知道这个卡西 cat 他呢是一个就是一个集合嘛,不可以放重复的元素啊,重复的元素往里边放了是放不了的对不对?他是 不能存储重复的元素的,那么这个卡西塞特他是怎么样来检查这个元素跟我这个卡西塞的里面已有的元素是否重复了?那么这个重复是怎么样定义的啊?怎么样去检查的? 我们来看一下啊,当一个对象或者说一个元素啊往这个卡西塞的里面去放的时候,这个卡西塞的呢?那首先呢就会根据我们的这个卡西扣的这个方法啊,当然你如果重新 写了,就调你重写的这个卡西扣的方法,没有重写,那么掉的就是这个欧巴,这个的中的这个 late 五方法啊,就是这个卡西扣的方法来了,判断就是就是计算出一个卡西扣的值啊, 获取出获取到这个卡西扣的值之后,那么对应着的就是我们卡西表中的这个位置,对不对?这卡西扣的就是一个缩影位置啊,那么计算出来了这个卡西扣的值之后,然后呢找到这个位置啊,来判断这个位置上面呢是否有值,也就是说我算出来了一个位置,比如说这有一张哈西表,对不对? 这张哈西表里面呢有很多的位置啊,大家可以来理解为,比如说是是一个数组,对不对?这个数组里面有很多的这个下标,那么呢我根据这个哈系扣的,其实呢已经把这个下标算出来了,比如说我算的下标是这个,那么呢我来看一下这个下标这个位置啊是否有值?是不是已经存储了元素? 如果说这个地方要是没有元素,他是空的,有,那就意味着这块内存呢,他是个空的,对不对?没有放东西,那么 ok, 直接了把这个值了放进来,那就假设对象呢没有重复出现,那么这个对象呢可以顺利的啊,就是 a 的到我们的这个卡西塞 中,那么如果在这个位置上发现有值的话啊,这个位置如果发现有值意味着什么?意味着我算出来的这个卡西扣的跟这个跟这个位置上的这个 元素,他的这个卡西扣的是相同的,这个就叫做卡西冲突啊,也就是说这个地方已经有值了,他的卡西扣的是这个对不对?是这个位置啊?那么我现在呢又计算出了一个哈西,又根据另外一个值啊,又计算出来一个哈西扣的也在这里啊,然后呢这个地方他的哈西扣的就是一样的,对不对?那么这个时候怎么办呢? 那这就判断这两个元素是同一个吗?他不见得啊,这个时候呢,他还会去调用一个一口舌,因为呢,在我们这个哈西口的这个散列算法里面啊,这个散列算法 不同的值了,两个完全不一样的数字啊,他都是有可能了计算出相同的卡其扣的的,这个是了这个闪电算法的一个,嗯,可以说是他 他的这个商业算法所决定的啊,两个不一样的值,他是有可能的计算出一个相同的哈系扣格的,但是这两个值呢,可能他确实不一 一样,那么这个时候怎么办呢?这个时候呢就要调用这个一口舌了,也就是我们程序员呢自己来定义的这个就是对比的这个方法,那么这两个对象到底相不相同,最终由你程序员呢来说了算,对不对?那么用这个一口舌头来检查这两个对象呢,是否真的相同, 那么这个时候如果调用了你重写的这个 ecos, 他还是相同的话,那么这个时候呢,就意味着这两个元素呢就冲突了,他就是相当于,就是,嗯,就是相等的,对不对?当然 ecos 你如果没有重写,那么就是双等于 比较,看他的是否是同一个内存地址啊,类同一个对象引用啊,那么如果是相同的话,那么哈西赛的不会让他呢成功加入,对不对?那么如果是不一样的话,哎,如果说我计算出的哈西扣的是一样的,但是我一口子 发现了这两个对象他不一样啊,不一样,那么这个时候怎么办呢?我还往这里放吗?那就不不行了啊,如果是不一样的话,那么就重新闪电, 你是按照这个散列算法啊,重新计算,重新计算的得到得到一个另外的一个散列值,当然这个地方呢,肯定是会做一些特殊的处理啊,做一个特殊的处理,让这个值了,比如说加盐啊 等等操作,让这个值了计算出一个额外的就是一个另外的一个卡西扣的值,然后这样的话呢,他的 位置呢就变了,对不对?比如说计算到了这个位置,计算到这个位置上来了,然后呢再次来判断,看这个位置是否相同,对不对?这样的话呢就能够啊,保证我这个元素呢,绝对不会跟我这个哈西赛的中的这些元素了 重复啊,那么这样做有什么好处呢?我们呢发现啊,如果说你的卡西扣的要是不一样的话啊, 如果说计算出这个哈西扣的这个地方是空的话,我还需要需要 ecos 吗?不需要,直接放进去就可以了,对不对?也就是说了,这个地方压根就没有任何,只是跟我的哈系扣的是一样的,我都不需要 ecos 啊,那么这个这样的话呢,其实就大大的减少了这个 ecos 的一个一个次数啊, 对吧?如果说没有这个卡西扣的的话,如果没有这个卡西扣的,我们是不是要跟这个散列表中所有的值都要去一口试一下,对不对?所有的每一个值我都要去一口试一下,看他是否相等,哎,如果不相等,那么呢,如果相等我就不能放,不相等我 才能往里边放,对不对?那么呢,这个一口十了,他是比较好性能的,他要去对比这个呃内存地址,而卡西扣的呢,这个哈西扣的这个散列算法呢,这个性能是相当之高的,那么这样呢,就可以大大的提高我们程序的这个执行的一个速度啊。好, 那么这个就是卡西扣的一个概念啊,那么明白了这个原理之后,那么对于这道题目,我们通常呢会怎么样去回答啊?当然这个 原理部分问到了就要说对不对,没有问到,当然你可以不说啊,那么如果只是简单的问这个卡西扣的跟 e 狗子到底是什么区别,到底是缺什么区别跟联系啊?当然你也可以去说一下这个东西啊, 那么主要呢,我们是通过以下这几个呃规定啊,就是在我们程序代码中,这个卡西扣的跟一口是他的,这个在我们代码里面啊,就是必须是遵守这样的规则,什么样的规则呢?那么如果两个对象相等的话,那么卡西扣的一定是相同的啊, 这个是我们程序必须要去保证的啊,就是两个对象相等,那么卡西扣的一定是相同的,那么如果两个对象相等啊,对这两个对象分别调用一口式方法,那么呢肯定也是要返回为处的啊。然后呢, 两个对象如果有相同的卡西扣的值,但是他们也不一定是相同的,我们之前呢,在这卡西塞的里面已经已经讲过了啊,正因为有这种有这种判断规则在这里啊,所以说如果说你要去覆盖一口子方法,那么呢卡西扣的方法你也必须覆盖,不然的话呢,在这卡西塞的这里面就会出问题,对不对? 好,然后呢哈西扣的的这个默认行为呢?是实际上就是对我们堆上的对象呢产生一个,所以值嘛,就是一个独特值啊,如果没有重写哈西扣的啊,那么这个卡拉斯的一个类的两个对象呢,无论如何他都是不会相等的啊,也就说他的哈西扣的,如果, 如果你没有重写的话,那么呢两个对象对应着两个引用地址对不对呢?绝对是不会相等的啊,那么 即使你这两个对象呢,拥有相同的这个成员数据对不对?那么如果你想让他想拥有相同的成员数据,让他能够呃对比的时候也是 相等的话,那么你就要去重写卡西扣的重写一口词,那么这就是卡西扣的跟呢这个一口词的。呃,这个面试的怎么回答的这个内容?