Hashcode相同但是equals不同的例子

大家都知道equals()相同时 hashcode 必须相同 但是hashcode相同并不一定eqauls 但是具体的例子还真没看过 我们可以看到String 的 hashcode()方法如下

public int hashCode() {
        int var1 = this.hash;
        if (var1 == 0 && this.value.length > 0) {
            char[] var2 = this.value;

            for(int var3 = 0; var3 < this.value.length; ++var3) {
                var1 = 31 * var1 + var2[var3];
            }

            this.hash = var1;
        }

        return var1;
    }
复制代码

这里我用我的姓的拼音来演示下 马(Ma) 在Ascii表中我们可以找到 Ma和编码分别是 77 66 这样算的就是(31*0+77)*31+66 数据有点少看不出来规律 再加上我的名 林(Lin) 76 69 110 这样算起来就是

((((31*0+77)*31+66)*31+76)*31+69)*31+110
复制代码

这样我们就可以总结出来规律啦

31*31(n-1)+str.charAt(0)*31(n-2)+str.charAt(1)*31(n-3)+...+str.charAt(n-1)
复制代码

其中的(n-*)代表根次方

这样我们就可以看出来了 如果构造相邻俩个最后的和一样 我们设比较的两个字符串的编码形式为 (x1)(y1)(x2)(y2) 他们俩只有中间俩个字符的编码不一样 那么怎么分别设置这两个字符串才能让他们的编码最后相同呢 经过一番高考之前的我附身 我们可以得到以下的等式

最最重要的是

(x1-x2)*31=(y2-y1)
复制代码

也就是相邻的两位如果前边的编码差 1 后边的两个的编码就要差 -31*1

俩个实例吧 还是上边的我的大姓 Ma 有哪个字符串是和 M(77)a(97) Hashcode相同的呢 其中一个结果竟然为 NB(敲黑板) N(78)B(66) 看起来我们这个姓比较厉害了

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值