Leonhap 2022-11-05 11:41 采纳率: 100%
浏览 35
已结题

java 如何理解equals与HashCode方法的重写代码

因为要用让HashSet组(存放题目)中的题目不重复,重写了equals方法与HashCode方法
请问这里重写equals 还有 HashCode方法应该怎么理解?

public class Question {
    private String Title;//题干
    private String Answer;//正确答案
    
    public Question(String Title,String Answer) {  //title是题干,answer是对应答案
        this.Title=Title;
        this.Answer=Answer;
    }
    public String getTitle() {
        return Title;
    }
    public String getAnswer() {
        return Answer;
    }

    //为了使得HashSet组中的题干唯一,需重写equals方法与HashCode方法
    @Override
    public boolean equals(Object obj) { 
        if(this==obj)
            return true;
        if(obj instanceof Question) {
            Question anotherQuestion = (Question) obj; 
           // 比较题干是否相同
            if (this.getTitle().equals(anotherQuestion.getTitle()))
            return false;
        }
        return true;
    }
    @Override
    public int hashCode() {
        return this.getTitle().hashCode();
    }
}

下面是调用equals的代码

//使用HashMap记录学号与密码
    private HashMap<String,String>userbank=new HashMap<String,String>();{
        userbank.put("James", "123456");
        userbank.put("Smith", "123456");
        userbank.put("Hellon", "123456");
    }
    
    //登录Login方法
    public boolean login(String username,String password) {
        String realPassword=userbank.get(username);//从userbank中读取真正密码
        if(realPassword !=null & realPassword.equals(password))
            return true;
        else return false;
    }

问题就是这两个方法重写的代码怎么理解,他们重写之后跟重写之前有什么区别,在调用中是怎么体现的?

  • 写回答

2条回答 默认 最新

  • CSDN专家-sinJack 2022-11-05 11:59
    关注

    如果不重写,两个对象之间比较的是地址,地址肯定不相等,所以达不到去重的效果。
    重写了equals方法与HashCode的目的是可以根据自己的规则来让程序认为对象之间什么情况下是相等的,如:只要对象中的各个属性值相等即认为两个对象是相等的,放进hashset集合中达到去重效果。

    
     @Override
        public boolean equals(Object obj) { 
            // 如果地址一样,则两个对象相同,返回true
            if(this==obj)
                return true;
            //如果两个对象是同一类型,则比较其属性值是否都相同。如果都相同,则说明两个对象也相同;返回true
            if(obj instanceof Question) {
                Question anotherQuestion = (Question) obj; 
               // 比较题干是否相同
                if (this.getTitle().equals(anotherQuestion.getTitle()))
                return true;
            }
            //上面情况都不满足,就返回false了,当前对象和参数对象不想等
            return false;
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月13日
  • 已采纳回答 11月5日
  • 修改了问题 11月5日
  • 创建了问题 11月5日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。