关于java里的equals()方法和==

首先,在了解equals()方法和==之前,我们先了解一下数据类型.Java里数据类型分为基本数据类型和引用数据类型.基本数据类型又分为四类八种:布尔类:boolean;整形类:byte,short,int;字符类:char;浮点类:float,double.引用数据类型可以分为:类,接口,数组.

在了解数据类型后,开始了解equals()和==

关于==

对于基本数据类型,使用==,比较的是他们的值.

对于引用数据类型,使用==,比较的是他们的地址.关于这里的地址,每new一次,都会开辟一个新的堆内存空间,产生一个新的地址。

所以,相同类,new出的不同对象,地址是不同的.

以下是==的使用说明:

public class DuiXiang1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a = 10;
		int b = 15;
		int c = 10;
		System.out.println(a==b);
		System.out.println(a==c);
		Test1 t1 = new Test1();
		Test1 t2 = new Test1();
		System.out.println("t1的地址是:"+t1+"  t2的地址是:"+t2);
		t1.a = 10;
		t2.a = 10;
		System.out.println(t1 == t2);
//通过对象调用里面的值做==比较,这时候比较的是值的大小,具体看结果证明
		System.out.println(t1.a==t2.a);
		

	}

}
class Test1{
	int a;
}

运行的结果:

false
true
t1的地址是:testDemo.Test1@e020c9  t2的地址是:testDemo.Test1@888e6c
false
true

由t1,t2的地址可以看出,同类下,new出的不同对象,地址是不同的.

关于equals()

equals是Object类中定义的一个方法,这个方法是用来比较对象的内存地址.但是在很多类中,都重写了这个方法,比如Integer,String,重写后的equals方法比较的是方法里的值,而不再是地址.具体使用请细心阅读一下代码,理解重写和不重写的区别:

下面是Object类里equals方法代码:

public boolean equals(Object obj) {
        		return (this == obj);  
    		}

我们可以看出,调用这个方法,返回的是两个对象地址比较的结果

我们来看一个实例:

public class DuiXiang {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
		Integer n1 = new Integer(10);//假设n1的地址是 -->001
		Integer n2 = new Integer(10);//假设n的地址是 -->002
		System.out.println(n1.equals(n2));
//原先equal方法比较地址值,但Interger类重写equals ,使方法变成--> 引用数据类型的值进行的比较
		
		Test n3 = new Test();//假设n3的地址是 -->003
		Test n4 = new Test();//假设n4的地址是 -->004
		n3.a=10;
		n4.a=10;
		System.out.println(n3.equals(n4));
//因为Test类里面没有重写equal方法,所以,equal方法比较的还是地址.

	}

}

class Test{
	int a;
	
}

运行结果:

true
false

由结果可以看出,Integer重写equals方法后比较的是值,Test类使用object中的equals方法,比较的是地址.

我们看一下Integer是如何重写equals方法的

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

我们自己重写equals方法

接下来,我要在我自己的Test类里重写equals方法,实现比较值的不同,而不是比较地址.以下是代码:

public class DuiXiang {

	public static void main(String[] args) {
		
		Test n3 = new Test();//假设n3的地址是---003
		Test n4 = new Test();//假设n4的地址是---004
		n3.a=10;
		n4.a=10;
		System.out.println(n3.equals(n4));

	}

}

class Test{

	int a;
	public boolean equals(Object obj) {
		Test t = (Test) obj;
		return a == t.a;
	}
}

运行结果:

true

由结果可以看出,我们通过重写equals()方法,实现了比较对象里的值.

猜你喜欢

转载自blog.csdn.net/znmdwzy/article/details/81265227