操作符“==”与对象的equals()方法
简介
操作符“==”比较两个操作元是否相等,这两个操作元既可以是基本类型,也可以是引用类型,例如
> int a1=1,a2=3;
> boolean b1=a1==a2;//"=="的操作元为基本类型,b1的变量值为false
> String str1="Hello",str2="world";
> boolean b2=str1=str2;//"=="的操作元为引用,b1的变量值为false
在java.lang.Object类中定义了equals()方法,用来比较两个对象是否相等。
1. 操作符“==”
当操作符两边都是引用类型的时候,这两个引用变量必须都引用同一个对象,结果才为true。例如:
Integer int1=new Interger(1);
Integer int2=new Interger(1);
Integer int3=int1;//int1和int3 引用同一个对象
System.out.println("int1==int2 is"+(int1==int2));
System.out.println("int1==int3 is"+(int1==int3));
运行上面程序,结果:
int1==int2 is false
int1==int3 is true
1.1操作符“==”和多态性
“==”用于比较引用类型变量的时候,“==”两边的变量被显示声明的类型必须是同种类型或者有继承关系,即位于继承树的同一继承分支上,否则编译报错;
假设有四个类Creature,Animal,Dog,Cat类,继承关系如图:
以下代码中,变量dog被声明为Dog类型,变量animal被声明为Animal类型,它们之间有继承关系,尽管这两个变量实际上引用的变量Dog’对象和Cat对象之间没有关系,仍然可以用“==”比较;
Dog dog=new Dog();
Createure creature=dog;
Animial animal=new Cat();
System.out.println(dog==animal);//合法,打印flase
System.out.println(dog==creature);//合法,打印flase
以下代码变量中dog被声明为Dog类型,变量Cat被声明为Cat类型,Dog类和Cat类之间没有继承关系,因此不能用“==”比较:
Dog dog=new dog();
Cat cat=new Cat();
System.out.println(dog==cat);//编译出错
1.2 操作符“==”用于数组类型
数组类型也是引用类型,也可以用“==”比较,例如:
boolean b1=new int[4]==new long[5];//编译出错,两边类型不一致
boolean b2=new int[4]==new int[4];//b2为false
int array1[]=new int[4];
int array2[]=array1;
boolean b3=array1==array2;// b3为true;
2.对象的equals()方法
equals()方法是在Object类中定义的方法,它的声明格式如下:
public boolean equals(Object obj)
Object 类的Equals()方法的比较规则为:当参数obj引用对象与当前对象为同一个对象时,就返回true,否则返回false
public boolean equals(Object obj)
{
if(this==obj)return true;
else return false;
}
例如以下animals1和animals2变量引用不同的对象,因此用” ==
“或者equals()方法比较结果都为false;而animals1和animals3变量都引用同一个Dog对象,因此使用”= =“或者equals()方法结果都为true;
Animal animal1=new Dog();
Animal animal2=new Cat();
Animal animal3=new animal1;
System.out.println(animal1==animal2);//打印false
System.out.println(animal1.equals(animal2));//打印false
System.out.println(animal1==animal3);//打印true
System.out.println(animal1.equals(animal3));//打印true
在JDK中有一些覆盖了Objiect类的equals()方法,他们的比较规则为:如果两个类型一致,并且内容一致,则返回true;这些类包括:java.io.File, java.util.Date, java.lang.String,包装类(如:java.lang.Interger和java.lang.Double类);
例如以下int1和int2变量引用不同的Integer对象,但是他们的内容都是1,因此用”==“比较多的结果是flase,但是使用equals()方法比较结果为true
Integer int1=new Integer(1);
Integer int2=new Integer(1);
System.out.println(int1==int2);打印false
System.out.println(int1.equals(int2));打印false
在实际应用中,==比较字符串是否相等,通常按照内容来比较才会有意义,因此应该调用String类的equals()方法,而不是采用"= ="操作符。==编程人员有时候会误用”= =“操作符,例如以下程序:
String name =new String("Tom");
if(name=="Tom")//比较结果为false,应该将”==“改为equals,比较结果才为true
{
System.out.println("Hello ,Tom");
}
else
{
System.out.println("Sorry,I don't know you.");
}
再例如Boolean类是包装类,只要两个Boolean对象的内容是一样的,equals()方法比较结果为true,以下程序打印C:
Boolean b1= new Boolean(true);
Boolean b2= new Boolean(true);
if(b1==b2)
if(b1.equals(b2))
System.out.println("a");
else
System.out.println("b");
else
if(b1.equals(b2))
System.out.println("c");
else
System.out.println("d");
运行结果如下图:
再例如以下变量b1和obj1变量声明为不同的变量,但是他们实际引用的是同一个Boolean变量,所以”==“操作符和equals()方法这两种比较方式结果都是true,以下程序打印a:
Boolean b1=new Boolean(true);
Object obj1=(Object)b1;
if(obj1==b1)
if(obj1.equals(b1))
System.out.println("a");
else
System.out.println("b");
else
if(obj1.equals(b1))
System.out.println("c");
else
System.out.println("d");
运行结果如下图所示:
在例如Float和Double类型是包装类型,只要两个Float对象或者两个Double对象内容一样,equals()方法比较结果为true
Float f1=new Float("10F");
Float f2=new Float("10F");
Double d1=new Double("10D");
System.out.println(f1==f2);//false
System.out.println(f1.equals(f2));//true
System.out.println(f2.equals(d1));//false,因为f2和d1不是相同的类型
System.out.println(f2.equals(new Float("10")));//打印true
运行结果如下图所示:
再看最后一个实例,变量a和b引用不同的String对象,但是他们包含的内容都是”hello“,而变量c是字符串数组类型,因此a.equals©结果为false
String a="hello";
String b=new String(a);
char c[]={'h','e','l','l','o'};
System.out.println(a=="hello");//打印true
System.out.println(a==b);//a和b引用的对象不一样,打印false
System.out.println(a.equals(b));//打印true
System.out.println(a.equals(c));//a和c的类型不一样,打印false
总结
操作符"= ="两边的操作元可以是基本类型,也可以是引用类型。当两个操作元都是引用变量的时候两个引用变量必须为同种类型或者有继承关系,否则编译失败,当两个引用变量都引用同一个对象的时候,结果为true,否则,结果为false
一般而言a.equals(b),a和b两个引用变量的引用对象一样且内容一致的时候,返回true,否则,返回false
本文参考书籍 :Java面向对象编程(第二版)—孙卫琴