首先,在了解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()方法,实现了比较对象里的值.