• 【源码学习之Object】


    equels方法底层学习

    问题:重写equals方法,必须重写hashcode方法吗?
    答:

    1.源码中equels比较的是内存地址,其实也就是==,==比较的是内存地址。

    //源码就这一行
    public boolean equals(Object obj) {
            return (this == obj);
    }
    

    2.在没有重写equals方法前,测试结果。

    private static UserJack user1 = new UserJack();
    
    public static void test1(){
            user1.setName("jack");
            user1.setSex("男");
    
            UserJack user2 = new UserJack();
            user2.setSex("男");
            user2.setName("bella");
    
    //此时user1 和 user2 不是一个内存地址
    //没有重写的情况下 无论里面值是多少 都会返回false
    
            System.out.println(user1==user2);//false
            System.out.println(user1.equals(user2));//false
    }
    public static void test2(){
        user1.setName("jack");
        user1.setSex("男");
    
        UserJack user2 = user1;
        user2.setName("bella");
        user2.setSex("女");
    
    //此时user1 和 user2 是一个内存地址
    //没有重写的情况下 无论里面什么值 都会返回true
    
        System.out.println(user1==user2);//true
        System.out.println(user1.equals(user2));//true
    }
    

    3.看着idea重写的equal方法

    @Override
    public boolean equals(Object o) {
    //直接比较两个地址
        if (this == o)
            return true;
    //下面要学习getClass方法,我暂且理解为还是比较运行时的类
        //false || false
        if ((o == null) || (o.getClass() != this.getClass()))
            return false;
    //强转后比较 属性值
        UserJack userJack = (UserJack) o;
        return name.equals(userJack.name) &&
                sex.equals(userJack.sex);
    }
    //还没学习
    @Override
    public int hashCode() {
        return Objects.hash(name, sex);
    }
    

    4.重写后测试比较

    /**
     * 重写equals后
     */
    public static void test3(){
        user1.setName("jack");
        user1.setSex("男");
    
        UserJack user2 = new UserJack();
        user2.setName("jack");
        user2.setSex("男");
    //此时两个地址,直接比较地址返回false
    //重写equals后比较的是属性,所以返回true
        System.out.println(user1==user2);//false
        System.out.println(user1.equals(user2));//true
    }
    public static void test4(){
        user1.setName("jack");
        user1.setSex("男");
    
        UserJack user2 = user1;
        user2.setName("bella");
        user2.setSex("女");
    //此时是同一个地址,直接==返回true
    //同一个地址,equals第一行比较地址,返回true,这里容易错。
    
        System.out.println(user1==user2);//true
        System.out.println(user1.equals(user2));//true
    }
    
    • 总结:== 比较的是内存地址,equals本身底层是比较的内存地址,重写后比较的是属性。这和重写equals的具体实现有关。
    • 碰到的问题:getClass()方法、hashcode()方法。
  • 相关阅读:
    时区处理
    C#视频取帧图
    【C#】C#获取文件夹下的所有文件
    利用web of science做论文综述
    C# HTML解析工具HtmlAgilityPack使用实例(一)
    C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
    win10文件夹或文件已在另一程序中打开
    指定网卡IP进行ping操作
    C# 使用WebClient时,在多网卡IP时,指定IP发送Web请求
    C# 消息队列
  • 原文地址:https://www.cnblogs.com/luruihua/p/12669014.html
Copyright © 2020-2023  润新知