"=="和equals方法究竟有什么区别?
==操作符的功能有两个:
A.如果==的两边都是基本类型变量、包装类对象所组成的表达式,==用于比较两边的表达式的值是否相等——只要两边的表达式的值相等,即使数据类不同,该运算符也会返回true。
B.如果==的两边是引用类型的变量,==用于判断这两个引用类型的变量是否引用同一块内存,只有当它们引用同一块内存时,==才会返回true。
而equals()则是一个java.lang.Object类的一个方法,因此任何Java对象都可调用该方法与其他对象进行比较。java.lang.Object类的equals方法的实现代码如下:
boolean equals(Object o)
{
return this==o;
}
从上面代码可以看出,如果一个类没有重写java.lang.Object的equals()方法时,此时equals()方法的比较结果与==的比较结果是相同的。
但Java允许任何类重写equals()方法,重写该方法就是让程序员来自己决定两个对象相等的标准——极端的情况下,我们完全可以设计出Person对象与Dog对象equals()比较返回true的情况——当然一般不会这么设计。
实际上重写equals()方法时通常会按如下格式:
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;
if (name == null)
{
if (other.name != null)
return false;
}
else if (!name.equals(other.name))
return false;
if (pass == null)
{
if (other.pass != null)
return false;
}
else if (!pass.equals(other.pass))
return false;
return true;
}
上面重写equals()方法用于判断两个Person对象是否“相等”,程序只要两个Person对象的name、pass相等,程序就可以把这两个Person对象当成相等——这是系统业务决定的。如果业务需要,我们也可以增加更多的参与判断的Field,当然也可以只根据name进行判断——只要两个Person的name相等,就认为两个Person相等,这都是由系统的业务决定。
总结起来就是一句话:开发者重写equals()方法就可以根据业务要求来决定两个对象是否“相等”。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步