equals和hashcode重写的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static void main(String[] args) {
        Set<Test> set = new HashSet<>();
        Test t1 = new Test("aaa");
        Test t2 = new Test("aaa");
        set.add(t1);
        set.add(t2);
        System.out.println(set.size());
        //我们对于equals方法已经很熟了,这里就不说了
        //t1.equals(t2)   == true
        //如果Test没有重写hashcode方法     set.size()  ->  2
        //如果Test重写了hashcode方法        set.size()  ->  1
        //原因:
            //在集合中,判断两个对象是否相等的规则是:
            //第一步,如果hashCode()相等,则查看第二步,否则不相等;
             //第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等
        //hashcode源码分析:String类的
            //实际上它是遍历了字符串的里面的所有字符,根据每个字符的ASCII码值进行遍历计算,关于那个固定值为什么是31,应该取这个值效率较高,可重复性较低
            /*public int hashCode() {
            int h = hash;
            if (h == 0 && value.length > 0) {
                char val[] = value;
     
                for (int i = 0; i < value.length; i++) {
                    h = 31 * h + val[i];
                }
                hash = h;
            }
            return h;*/
        //equals源码分析:string类
            //这个相信大家都看过,遍历字符串里的所有字符,然后逐一进行比较,只要有不相同的就return false
        //所以
            //equals相同的两个对象,其hashcode码一定相同,因为hashcode码就是根据值去算的
            //两个对象的hashcode码相同,可能存在偶然的情况,字符串不同,算出的hashcode码一样
    }

  

posted @   李勇888  阅读(145)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示