嗯嗯 嗯 嗯嗯嗯。
粉丝9590获赞5.6万

哈西算法哈西冲突的解决方案?首先我们了解一下哈西冲突的基本概念,以 gdk 当中的哈西迈克为例, 哈西迈普的实线是以散列表为基础,当元素 a 和元素 b 通过同一个哈西算法 进行哈西运算,并且定位到哈西表当中相同的位置是即产生了哈西冲突,那么这种冲突可能是哈西算法得到的值相同产生的等值碰撞,或者定位的地址相同产生的等值碰撞。 那么看一下解决方案,第一个解决方案,链接之法哈西迈普中呢,他会采用链表来记录当前发生哈西冲突的元素,具有处理 简单的特点,但会造成空间浪费,也要考虑链表过长的这个缺陷,所以哈西麦普用红黑数来优化这一问题。解决方式二,开放地址法,也就是所有的地址对所有的值开放。当哈西表中存在某一些元素, 当一个元素需要插入时,产生冲突的时候,通过主次向下找,直到找到不冲突的地址,成为现行探测的方式。 那么可以扩展现行方式的这个不长,通过平方累加的方式进行跳跃查找不冲突的元素成为在平方探测, 也可以通过随机函数来计算,随机数加上哈欠冲突的位置来得到下一个位置,成为随机探测。 第三个方法是在哈西法,在哈西法指的是冲突的哈西,指通过再次的哈西运算处理,直到没有哈西冲突。 最后一种方式是建立公共溢出区的方式,将所有冲突的哈西元素呢放入到一个公共溢出区去处理。

呃,加号记住二十七,那么我们来看一下这个啊,你是否重写过哈西扣的和这个一扣子, 呃,当集合要添加新的元素的时候呢,我们会调用这个集合这个元素的一个哈气扣的这个方法,那么这个哈气扣的方法呢?他能定位到他这个应该在我们这个瓷盘上的一个物理位置, 呃,如果这个位置上呢,他没有存在过元素,那么我们就可以把这个新的元素呢直接存储在这个位置上啊,不用做任何的比较。那么如果这个位置上已经有元素的话,那么我们还要需要调用他的一口的方法与这个新元素进行比较,那么如果说 他们俩的内容相同的话,那么嗯就不能放了,如果不相同的话呢,那么我们就需要怎么样?就需要去做做这个地址的一个省略,解决这个, 嗯,解决这个冲突啊,所以呢,这里存在一个冲解决的问题啊,这样一来呢,我们实际上都要用的是依靠的方法的次数呢就会降低 啊,所以呢,对于加瓦,对于呃这个一口的方法和哈士口的方法一般是这样规定的,如果两个对象相同,那么他们的哈士扣的值一定会相同,如果两个对象的哈士扣的值相同,他们并不一定相同啊,因为他们还要再次比较他的这个一口子,比较他的内容是否相同。

为什么重写了 eq 的方法,还要重写哈西扣的方法? oppojit 的哈西扣的方法是本地方法,也就是用 c 或 c 加加实现的,该方法直接返回对象的内存地址,然后再转换成整数得到哈西扣的值。 而一扣子方法重写后比较的是内容,规定两个对象的哈西扣的值相等,但是两个对象的内容值不一定相等,这就是我们所说的哈西冲突的问题。 两个对象的值 eq 是比较相等的情况下,则两个对象的哈西扣的值一定相等。阿里巴巴开发规范强制要求关于哈西扣的和 eq 值处理遵循如下规则,只要付写 eq 的方法,就必 必须复写哈斯扣的方法。因为晒得成熟的是不重复的对象,依据哈去扣的和 eq 进行判断,所以晒得成熟的对象必须复写这两个方法说明,如果自定义对象作为 map 的见, 那么必须复写 hot code 和 equals 方法。使俊已经附写了 hot code 和 eq 的方法,所以我们可以愉快的使用使俊对象作为 key 来使用。

为何重写 ecos 方法就得重写 hashco 的方法?我们知道 drop 设计的顶级副类 object 类中有两个方法很特殊,分别是 ecos 方法与 hashco 的方法。当在使用的时候,我们总是被提醒,一旦重写了 ecos 方法, 就一定要重写 hash cold 方法,这是为什么呢?接下来我们一起来分析下。先来看看 object 这个类的作者是怎么说的。打开 object 类,我们能看到相关注视, 从注视中我们可以得到以下几点,同一个对象反复调用 hashco 的方法,返回的结果都是一致的,当然前提是这个对象没被修改过。如果使用 equals 方法比较得到两个对象相等,那么这两个对象 去调用 hash code 方法,返回的值是相等的。两个对象的 hash code 值相等,两个对象不一定相等。由此我们可以得出结论,如果两个对象一过算,结果相同,那么 hash code 值肯定相等。如果两个对象的 hash code 值不相等, 那么这两个对象也不相同。我们再来看看 object 类中的 equals 方法, equals 是用来判断两个对象是否相等的, 从官方注视可以知道他具备的性质,他是自反的,对称的,可传递的一致的, 感兴趣的同学可以看下详细的注释内容。另外有一句话是要特别注意的,就是每当重写此方法时,通常都需要重写 has code 方法,以维护 has code 方法的一般约定,即相等的对象必须具有相等的哈西马,所以从根本上, hash code 和 equals 这两个方法就是配套使用的。 为什么这么设计呢?从 object 类中可以看到, equals 方法其实就是直接使用等等进行比较的。所以默认情况下,只有当两个引用对象指向同一个在堆中被分配内存的实力时,也就是内存地址值相同时,则才会返回出入, 否则则返回 force。 我们看个简单的例子,上面这段代码 a 是我们自定义的一个类, 并没有重写 equals 方法,这个时候得到的结果会是 force, 因为在堆中会是两个不同的实力。但是在实际开发过程中,我们往往想要比较的是 属性内容是否相等,也就是说,上述的代码我们希望返回 true。 其实像常见的 screen 类就是重写了 equals 方法,当内容相等时,则返回 true。 通过原码我们能看到 string 对象在调用 egos 方法比较另一个对象时,除了认定相同地址值的两个对象相等以外,还认定对应着的每个字符都相等的两个 string 对象也相等,即使这两个 string 对象的地址值不同。 接下来我们思考一个问题, string 类中对 egos 方法进行重写扩充了,但是如果此时我们不将 hash code 方法也进行重写,也就是说 string 类调用的依旧是来自顶级复类 object 类中的 hash code 方法,即 对于两个字符串对象,使用他们各自的地址值映射为哈西值,会出现什么问题呢? 就会出现被 string 类中的伊果尔方法认定为相等的两个对象,拥有两个不同的哈西值。问题分析到这里,原来的问题为什么重写伊果尔斯方法就得重写 hashco 的方法就有了答案, 因为必须保证重写后的 egos 方法认定相同的两个对象拥有相同的哈西值,可能又有同学会问了, 为什么要保证他们的哈西值相等呢?不相等会有什么问题呢?我们继续来分析。在分析这个问题之前,我们先看一个某大厂相关的开发规范,只要复写 equals, 就必须复写 hash code。 因为 set 存储的是不重复的对象,依据 hash code 和 equals 进行判断,所以 set 存储的对象必须复写这两个方法如果自定义对象作为 map 的键,那么必须复写 hash code 和 equals。 带着这个规范,我们以 hash map 为例, 看一下他的 put 方法。从代码中可以看出,仅仅是通过哈西直相等来证明两个对象是相同对象是行不通的,需要再做进一步的证明。 即上图红框中,为了证明两个对象是同一对象,还要求二者哈西执相等假设。此处我们使用了重写了 egos 方法而未重写 hash code 方法的 stream 类型的值来作为 t 值,然后使用地址值不同而字面量相同的两个 stream 对象 s, e 与 s r, 也就是字面相同。假设为 k 蛋 hashcloud 不同, 红执行 hashmap 的 put 方法后,就会产生字面均为 k 的两个 k, 在 hashmap 中插入了两次直,分别为 v 一和 v 二,这也就乱了套了。 讲到这里,相信大家对重写 egos 和 hashco 的方法应该有了更深入的了解了,欢迎留言讨论。

如果我想去解决那个,呃,限制安全问题,有哪些方法可以解决?嗯,可以使用肯卡尔的哈奇麦 map, 他那个就是适合于多线程,然后速度也比较快,也可以使用 siris 的关键字或者 log 加速解决。你认为是什么是限制安全性?你对他是怎么理解的? 呃,县城安全性,就是比如说同一时间内他只允许一个县城去修改数据,比如说如果我这个县城修改完数据之后,另一个县城也进来把那个数据修改了,他就不太好了,不好就怎么没有数据的一一致性,就是也不遵循那个原子形。就比如说如果我抢票的话,我就可能发生超迈的一个情况。嗯, 呃,关于解决哈气冲突的问题有哪些方法?呃,肯,他用的哈气麦吧,就是使用呃 siris 的关键字和那个 cas 算法,然后 siris 的开始冲突。我是说经验哈气冲突练表,这就是解决哈气冲突的一种方法。 劣质寻字法,在哈西法,线性寻字法 sured logo 里面列表哈西麦,康卡尔,哈西麦,在哈西,比如说像那个 be to man 啊,那个 no, 这叫哈气冲突的问题。

他们狗到底怎么实现的?这个时候他已经很多人就不知道怎么去回答了。所以这个圆码是很重要的。那么如果说再深入一点的人,他可能会答出他是 wifi 吗?对不对? 那么这个时候为什么又会问你了,他是吧? time, 他是怎么去做到的?他会有什么弊端啊?这个时候你们又打不出来了。所以你们发现很多人还有会觉得哎,老师,我平时用不到,就是我会忘记,对吧? 或者说我不去用,我就不知道。那么这个时候你一定要想到你学东西啊,一定啊,不只是学,而是说第一个你要学透,学懂,学明白。这个怎么去解决呢?有几个很好的办法。第一个,思想提升。 这些东西你可以去史杰伦嘛,哈士嘛, time 嘛。那么这些思想跟其他的一些技术,或说你自己的场景要联系起来,这是你们要做的一件事情。你会觉得很多东西就是觉得没 必要学,对吧?但是当你学到一些东西的时候,你其实你会发现很多东西都是连起来的。比如说只要你学好了哈西 map, 学好了 three 的 logo, 那么你就肯定知道我去怎么解决哈西冲突。 那你知道怎么解决哈西冲突,或者说你知道哈西冲突会带来哪些弊端,那你肯定知道 reds 里面的不能过滤器它会有什么不足, 这个东西肯定会知道的,因为他和哈西不能过滤器,他的不足就是由哈西冲突带来的。所以你们缺少的。不是说我学了就忘,或者说你的问题不是学了就忘,而是说你学的时候你没有整个知识体系学透, 所以你在学东西的时候,你是背这个东西,很多关键性的东西你在学的时候你想不到。你看现在你学的这两个东西,如果说你再来看不能过滤器,那么这个时候你觉得我还会忘吗?根本就不会忘。 假如说面试官再来问你对吧?解决哈西冲突有哪些方法对吧?怎么去解决哈西冲突,你会忘吗?不会,因为这个东西就是思想层面已经提升了。想到哈西冲突,我就肯定会想到这些东西。还一个,你自己要用,结合业务去使用。 第一个你要做的第一件事情是学透,不要去背八国文,不要背没用,也不要停留在听懂。 虽然现在很多人连听懂这一层都没有达到,但是你们的要求肯定是不要停留在听懂,而是说整个思想层面能够去提升上来。然后呢,结合自己的业务,假如说有一个需求, 这个需求很类似,比如说订单自动会过期对不对?假如说你在淘宝买个东西,三个小时以后你还没支付,我会告诉你你已经过期了,那么这个时候你是不是可以用到时间了,怎么去做啊?我我肯定也是一个延迟嘛,延迟三十秒,你还没有支付对不对?那我 去通知你发消息也好,你要支付了,三十秒以后,马上你就即将过期了。那么假如说你支付了,那我就不管了,那我是不是也可以用到时间轮,加上延时加定规的思想。那很多东西,其实在工作中你肯定是遇到这样子的场景的, 所以这是你们需要去解决的。所以你要做的事情,你需要学,你需要去提升,你需要能够去砌墙,你要能够去设计整个楼层。所以我现在你们进来,我可以给你做一个学习规划。

每天一个技术点,上期视频讲解了 ecose 方法,这期视频就讲讲 ecose 方法常搭配使用的哈西扣的方法。它和 ecose 方法一样,都是定义在 object 的点 成复类中,此类可以进行重写。哈西扣的方法是 native 方法,如果没有重写,那他通常会将内存地址转换为 int 数值进行返回。我们用哈西扣的方法获取到的这个 int 数值就是哈西马,也叫闪列马,它的作用就是确定对象在哈西表中的所引位置。 只要搞懂了哈西表的机制,也就能搞懂哈西扣的方法了。为了照顾还没有学过集合的小伙伴,这里就当做没有集合这些东西,我们从头来简单推导一下哈西表的基本原理。假设现在有这么一个需求,我想让一批对象能够存 存储起来,不允许存储重复的对象,并且能够随时获取对象。一说起存储,那自然就想到了数组。我们可以将对象挨个放在数组中,当判断对象是否重复存储时, 或者获取指定对象时,我们每次都得从头开始便利数组。挨个和数组中的对象进行 ecose 比较, ecose 结果为真,就代表找到了指定对象,这样确实满足了需求。但有一个问题就 是效率太低了,每次都得便利整个数组。假设数组中有一万个对象,那每次操作我都得比较一万次 时,时间复杂度为 on, 有没有办法可以提高效率呢?这时候通过哈西扣的获取到的哈西马就派上用场了。我们在存放对象时,可以通过哈西马来和数组长途取鱼,这样就能 得到数组要存放的位置,比如数组长度为十,对象的哈西马为十七,那十七除以十归于七,我们就可以将这个对象存放到下标七的位置上。这样无论是存储元素还是获取元素,通过数组下标就只用操作一次,时间复杂度为 oe。 现在大家应该能体会到哈西马的作用了,确定所引位置就能大幅提高效率。不过现在还有一个很大的问题,那就是哈西马是可能会重复的,毕竟哈西马 是通过一定的逻辑计算出来的 inter 数值,那两个不同的对象完全有可能哈西马会相同,这就是我们常说的哈西冲突。当要存储的对象和已经存储的对象发生哈西冲突时,我们首先要做的就是判断这两个对象是否相等,如果相等那就好办, 因为这算作重复元素吗?我就不用存储了。如果不相等,那我再将新对象想别的办法存起来。那两个哈西冲突的对象该怎么判断相等呢?当然是用 ecose 方法了,这里也就能明 为什么建议哈西扣的方法和 e cos 方法要同时重写。因为哈西扣的方法用来定力,所以位置以提高效率的同时可能会发生哈西冲突。当哈西冲突时, 我们就得通过 ecose 方法来判断冲突的对象是否相等。如果只重写了哈西扣的方法,那哈西冲突发生时, 即使两个对象相等,也不会判定为重复,进而导致数组里会存储一大堆重复对象。如果只重写了一 cos 方法,那两个相等的对象内存地址可不会相等,这样还是会造成重复元素的问题,所以两个方法最好 一起重写。最后总结一下,哈西扣的方法用来在最快时间内判断两个对象是否相等,并定位锁引位置,不过可能会出现误差。 ecose 方法用来判断两个对象是否绝对相等。哈西 coe 的方法用来保证性能, ecose 方法用来保证可靠。跟着螃蟹哥技术不翻车。

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

有没有可能两个不相等的对象有相同的哈西阔的呢?当然是有可能的,两个不相等对象,他也有可能有相同的哈西阔的,这就是为什么在哈西卖部当中他会有哈西冲突。举个例子,我们来看代码,看以下的代码,这个代码是这个样子, 就是我打印一下大写的 a 和小写的 a, 它的一个哈西括的,大写的 b b 这个字符串的哈西括的。打印一下 c 紧它的哈西括的。我们把它运行一下, 你会发现他们的哈西 coat 值都是二幺幺二,也就是说这三个完全不同的字符串,他们的哈西 coat 值是一样的。所以呢,有可能两个,或者是三个,或者是多个不相等的对象,他们都有可能会有相同的哈西 coat 值。