java重写equals和hashCode方法

equals()方法

对于基本数据类型,如int、double、boolean等,“==”比较的是值本身是否相等;对于非基本数据类型,比如说一个类的对象,“==”比较的却是变量存储的地址,而不是值本身(引用等价性)。
String str1 = new String("hello");
String str2 = str1;
System.out.println(str1 == str2); //true
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); //false

即使内容相同,但是由于存储地址不同,故“==”结果为false。为了解决上面的问题,我们可以用equals()方法来比较两个值是否相等。

首先先来看一下Java中的Object.equals()方法

public boolean equals(Object object){
      return(this == obj);
}
我们现在调用String类中的equals()方法
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); //true

所以比较类对象是否相等时,我们不能简单的使用“==”,而是要调用该类的equals()方法。对于自己写的一个类,我们需要重写equals()方法,否则会去调用Object类的equals()方法。

@Override public boolean equals(Object that)

这里给出一个重写equals()的方法,为了构造自己逻辑相等这一概念。

Class Person {
    private final String Name;
    Private final int age;

    public Person(String Name, int age) {
        this.Name = Name;
        this.age = age;
    }
    public String getName() {
        return Name;
    }
    public int getage() {
        return age;
    }

}
1. 检测this与that是否引用同一个对象:
if(this == that) {
    return true;
}
2. 检测that是否为null,如果为null,返回flase:
if(that == null) {
    return false;
}
3. 判断this与that是否为同一类对象,如果是的话,将that转换成相应的对象类型,就可以进行比较了:
if(that instanceof Person) {
    Person other = (Person)(That);
    return this.getName().equals(other.getName()) && this.getAge() == other.getAge();
}

比较时也要注意,对于基本数据类型,用“==”比较即可,但是对于对象数据类型,需要用equals()方法。

如果重写equals()方法的话,必须重写hashCode()方法,以便用户可以将对象插入到散列表中。

hashCode()方法

在重写hashCode前,可以自行看一下JDK中String类的hashCode()方法如何实现的,采用了31作为乘子,由于31为一个不大不小的质数,并且 31 * i = ( i<<5 ) - i 。除了31外,17、37、41、43也可以,还是看上面那个例子。

@Override public int hashCode() {
    int result = 17;
    result = 31 * result + Name.hashCode();
    result = 31 * result + age;
    return result;
}

为什么要写hashCode()呢,简单的说就是为了保证同一个对象,保证在equals()为真的时候hashCode一定相同,如果仅重写equals(),就有可能出现两个不同的对象满足equals()。在重写equals()和hashCode()方法时,要注意它们两个要保持一致,比如说,equals()中比较的时Name和age,所以hashCode()中也需要必须只用到Name和age。

在自己定义的类数据类型中,一定要重写equals()和hashCode()方法。

其实。IDE可以生成equals()和hashCode()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值