equals 与 == 不试不知道,一试吓一跳

这篇博客探讨了Java中`equals()`和`hashCode()`方法的重要性。通过示例展示了当这两个方法被重写时,如何影响对象的比较和哈希表行为。文章指出,当重写`equals()`时,通常也需要重写`hashCode()`以确保一致性。同时,解释了字符串常量池的概念,以及不同创建方式对字符串对象的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.wms;

import java.util.Objects;

public class User {
    private String name;
    private String pwd;

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) &&
                Objects.equals(pwd, user.pwd);
    }
//
//    @Override
//    public int hashCode() {
//        return Objects.hash(name, pwd);
//    }
}

package com.wms;

public class Test {
    public static void main(String[] args) {
        String a = "中午";
        String b = "中午";
        String c = new String("中午");
        String d = new String("中午");
        User user1 = new User("张三", "123");
        User user2 = new User("张三", "123");
        System.out.println(a == b);//true
        System.out.println(a.equals(b));//true
        System.out.println(a == c);//false
        System.out.println(a.equals(d));//true

        System.out.println(c == d);//false  比较值、比较地址
        System.out.println(c.equals(d));//true
//      System.out.println(user1==user2);//false   重写equals和hashCode方法
//      System.out.println(user1.equals(user2));//true 重写equals和hashCode方法

//      System.out.println(user1==user2);//false      未重写equals和hashCode方法
//      System.out.println(user1.equals(user2));//false  未重写equals和hashCode方法

        System.out.println(user1 == user2);//false      重写equals但未重写hashCode方法
        System.out.println(user1.equals(user2));//true  重写equals但未重写hashCode方法
        System.out.println("user1.hashCode()" + user1.hashCode());//重写equals但未重写hashCode方法 : user1.hashCode()589446616
        System.out.println("user2.hashCode()" + user2.hashCode());//重写equals但未重写hashCode方法 : user2.hashCode()1321640594

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值