为什么要重写hashcode

import java.util.HashMap;
import java.util.Map;

public class has {
}
class Test {

public static void main(String[] args) {
    Person person1 = new Person("TUCJVXCB");
    Person person2 = new Person("TUCJVXCB");


    Map<Person, Integer> hashMap = new HashMap<>();
    hashMap.put(person1, 1);


    System.out.println(person1.equals(person2));
    System.out.println(hashMap.containsKey(person2));//map.containsKey();  //获取map指定的键名 判断是否包含指定的键名
}

static class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) //Object obj 表示obj是Object类型的变量。
     //Object是这些类的原始祖先。String类什么的包括你自己定义的类,都可以归到它的名下。(int 不是类,是基本数据类型)
     //好处是,这样可以适应更广泛的传参类型而不必每个类的参数类型都去专门定义一个功能类似的方法,当一个方法为
     //fun(Object a){}的时候
     //你用String做a也可以,用YourClass自定义的类做a等都可以
    //而你如果只是
    //fun(String a){ }的话,就只能用String来做参数a。当你需要其他参数的fun的时候,你还得再新写一个fun(OtherClass a){}
    {
        if (obj instanceof Person)//
        //instanceof用来判断一个对象是不是一个类的实例,
        //也可以看它是不是数组(不过不经常用)。Person   person=(Person)obj,
        // 是将obj转换成Person的实例。如果Person继承了Object,运行的时候不会有什么异常,
        // 但如果Object继承了Person的话,运行的时候会抛出异常。
        // 这句话用于判断Person是否被obj包含,
        //如果不属于的话后面的 Person p = (Person)obj;就无法执行了。
        {
            Person person = (Person) obj;

            return name.equals(person.name);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }

//equals(Object)方法比较是相等的,那么调用这两个对象中的hashCode方法都必须产生同样的整数结果
// 如果一个类重写了equals方法但是没有重写hashCode方法,那么该类无法结合所有基于散列的集合(HashMap,HashSet)一起正常运作。
//相等的对象必须拥有相等的hash code
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值