重写equals()和hashCode()方法,用于比较对象的内容

一、Object类的概述
(1)基本概念
Java.lang.Object类是所有类层次结构的根类,任何类都是该类的直接/间接子类。

(2)常用的方法
boolean equals(Object obj) - 用于判断调用对象是否与参数对象相等。

该方法默认比较两个对象的地址,与 == 的效果等效。
若希望比较对象的内容,则需要进行方法的重写。
若该方法重写了,则应该去重写hashCode()方法,为了满足hashCode()的常规协定
int hashCode() - 用于获取调用对象的哈希码值(内存地址的编号)并返回。

若两个对象调用equals()方法相等,则各自调用该方法得到的哈希码值必须相同。
若两个对象调用equals()方法不相等,则各自调用该方法的结果可以相同,
但最好不相同。
String toString() - 用于返回调用对象的字符串表示形式。

默认返回的字符串内容是:包名.类名@哈希码的无符号十六进制形式。
若希望返回其他内容,则需要进行方法的重写。
当使用print()/println()打印引用变量时,会自动调用toString()方法。
当使用字符串和引用变量进行拼接(+)时,会自动调用toString()方法。
 

public class Person {
    private String name;
    private int age;

    public Person() {
        super();
    }
    public Person(String name, int age) {
        super();
        setName(name);
        setAge(age);
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        if(age > 0 && age < 150){
            this.age = age;
        }else{
            System.out.println("年龄不合理!!!");
        }
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)  
            return false;
        //当调用对象和参数对象的类型不相同时
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        //当调用对象的name为null,参数对象的name不为空,则内容一定不相同
        if (this.name == null) {
            if (other.name != null)
                return false;
        //当调用对象的name不为空时,调用equals()方法与参数对象的name比较
        //若不相等则返回false,再进行!取反运算后变成true,此时证明字符串不相同
        } else if (!name.equals(other.name))
            return false;
        //剩下的都是true,字符串相同
        return true;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    /*@Override
    public boolean equals(Object obj){
        //1.若调用对象和参数对象的地址相同,则内容一定相同
        if(this == obj) return true;
        //2.若参数对象为空,则内容一定不相同
        else if(obj == null) return false;
        //3.若参数对象和调用对象的类型相同,则根据姓名来判断是否相等
        else if(obj instanceof Person){
            Person p = (Person)obj;
            //if(this.getName() == p.getName())  比较对象的地址 new String();

//          if(this.getName().equals(p.getName())){
//              return true;
//          }
//          else{
//              return false;
//          }

            return this.getName().equals(p.getName()); //比较对象的内容
            //return this.getName().equals(p.getName()) && this.getId()==p.getId();
        }
        //4.若参数对象和调用对象的类型不同,则内容一定不同
        else return false;
    }

    @Override
    public int hashCode(){
        int type = 12;
        return type*31 + getName().hashCode();
    }

    @Override
    public String toString(){
        return "Person[name = " + getName() + ", age = " + getAge() + "]";
    }*/

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值