Object类的equals、hashCode、toString方法

本文详细介绍了如何在People类中重写equals、hashCode方法以实现对象比较,并讨论了toString方法的作用。通过实例展示了如何根据对象属性进行有效比较,以及重写后的哈希值和字符串表示的改变。
摘要由CSDN通过智能技术生成

Object类的equals、hashCode、toString方法

一、equals方法

​ equals方法是用来比较两个对象是否相等的,默认比较的是内存地址是否相同。

package bao;
public class People{
	String name;
	int id;
	public People(String name,int id){
		this.name = name;
		this.id = id;
	}
}
import bao.People;
public class Test1{
	public static void main(String[] args){
		People p1 = new People("zhangsan",1234);
		People p2 = new People("zhangsan",1234);
		//People p2 = new People("lisi",2345);
		System.out.println(p1.equals(p2));
        //System.out.println(p1.hashCode());
		//System.out.println(p2.hashCode());
        //System.out.println(p1.toString());
		//System.out.println(p2.toString());
	}
}

像这段代码创建了两个对象,输入的值是相等的,但是进行比较输入的是false。

在这里插入图片描述

在实际中比较内存地址的实用性不高,往往需要自己进行重写,使得比较有意义。

接下来对equals方法进行重写

package bao;
public class People{
	String name;
	int id;
	public People(String name,int id){
		this.name = name;
		this.id = id;
	}
	//重写equals方法
	@Override
	public boolean equals(Object obj){
		if(!(obj instanceof People))
			return false;
		People p = (People)obj;//Object类型强制转换成People
		if(this==p)//比较地址
			return true;
		if(p.id==this.id)//比较id值
			return true;
		else
			return false;
	}
}

这里的instanceof的作用是判断obj是不是People的一个实例对象是的话返回true,不是的话返回false,或者obj是否为null,为null则返回false,不是就返回true。开始对People p = (People)obj;这个语句存在一些疑惑明明就是两个People的对象在比较了为什么还要转呢?通过查询知道了,equals方法的参数是Object类型的,它并没有id和name属性,无法进行比较。

此时的运行并打印出哈希值结果为:

在这里插入图片描述

重写方法前写了一个@Override写了它的话编译器会验证下面写的方法名是不是父类中有的,如果没有它编译也可以通过但是,如果此时方法名或者参数类型写错的话就会被认定是另外一个方法,编译一样能过但是达不到重写的效果。当写了它方法名或者参数类型又写错了就会报下图的错。

在这里插入图片描述

二、hashCode方法的重写

在equals方法的官方文档中有一个注意事项:

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

重写了equals方法通常也需要重写hashCode方法,在hashCode方法中有常规协定用equals比较相等的两个对象它们的hash值也要相等;

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

重写后的哈希值就变成一样了

在这里插入图片描述

三、toString方法

toString方法的作用是返回对象的字符串表示,它的默认值是,这个对象的类名+@+这个对象的哈希值的无符号十六进制表示。可以通过重写toString方法把对象的属性都输出出来,

	@Override
	public String toString(){
		return "name=" + this.name + "\nid=" + this.id;
	}

重写前:

在这里插入图片描述

重写后:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值