注意重写类的equals()方法

Posted cstdio1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注意重写类的equals()方法相关的知识,希望对你有一定的参考价值。

注意在java中在比较引用类型时==和原生的equals()方法比较的都是看它们否是同一个对象(说的更直白一点就是他们在内存的位置是否是一样的),但我们在真实世界中关注的往往只是其中的某个属性是否相等,如果某个属性相等我们就认为他们是相等的,所以我们需要在自己定义的类中重写equals()方法。

当然基本类型用==比较是否相等还是不会存在甚麽问题了

注意:在String和Intrger中都已经重写过了,所以可以直接用equals()进行比较

 

public class Citizen {//公民类
	private String id;
	public Citizen(String theId){
		id=theId;
	}
	
	/*
	 * 覆盖父类(Object)的equals()方法
	 * 因为在真实世界中我们只是关心“公民”是不是相同,而不关心他们在内存中存放的位置是不是一样
	 */
	
	public boolean equals(Object obj){
		
	if(obj==null){
		return false;
	}
	if(obj==this){//如果是同一个对象id一定相同
		return true;
	}
	if(this.getClass()!=obj.getClass()){//判断所处的类是不是相同,总不能拿人和小猫看是不是同一个吧
		return false;
	}
	Citizen c = (Citizen) obj;//将对象转化为Citizen的类型
	
	return c.id==this.id;//返回她们的id是否相同
		
		
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Citizen p1 = new Citizen("id00001");
		Citizen p2 = new Citizen("id00001");
		System.out.println("p1==p2: "+(p1==p2));
		//如果不重写equals()方法返回的是false
		System.out.println("p1.equals(p2): "+(p1.equals(p2)));
//-------------------------------------------------------------------------------------------------------		
		Integer t1 = new Integer(227);
		Integer t2 = new Integer(227);
		System.out.println(t1.equals(t2));//比较值
		System.out.println(t1==t2);//比较对象
		//特殊情况:在java中为了节省创建对象的时间,对于一些常用的对象会在内存中缓存下来。
		//当int、short类型在-128~127或者在u0000~u007f的char类型的值的时候,产生的对象会会缓存在内存中,
		//当试图通过自动装箱产生一个相等值的Integer的值时,系统不会生成新的对象,而是直接使用内存中已经存在的对象
		t1=127;
		t2=127;
		System.out.println(t1==t2);//比较对象
		
		
	}

}

 

以上是关于注意重写类的equals()方法的主要内容,如果未能解决你的问题,请参考以下文章

重写equals 方法的注意事项

java中重写Object类的equals方法为啥要重写hashcode方法?不重写可以吗?

java中重写Object类的equals方法为啥要重写hashcode方法?不重写可以吗?

重写java类的equals()和hashCode方法

object类的equals方法简介 & String类重写equals方法

关于object类的两个重要方法以及为什么重写equals一定要重写hashcode()