一、 操作符“==”
用来比较两个操作元是否相等,这两个操作元可以是基本类型,也可以是引用类型。
当操作元是引用类型变量时,这两个引用变量必须都引用同一个对象,结果才为true。
Integer int1 = new Integer(1);
Integer int2 = new Integer(1);
Integer int 3 = int1; //int3和int1引用同一个对象
int[] arr1 = new int[1];
int[] arr2 = new int[1];
int[] arr3 = arr1; //arr3和arr1引用同一个对象
System.out.println(int1==int2); //结果为false
System.out.println(int1==int3); //结果为true
System.out.println(arr1==arr2); //结果为false
System.out.println(arr1==arr3); //结果为true
注意:当用于比较引用类型变量时,“==”两边的变量被显示声明的类型必须是同种类型或有继承关系,即位于继承树的同一个继承分支上,否则编译报错。
例如:有三个类,Person类为父类,Student类、Teacher类都直接继承Person类。
Student s = new Student();
Teacher t = new Teacher();
System.out.println(s==t);
编译出错。
Person s = new Student();
Person t = new Teacher();
System.out.println(s==t);
由于声明类型相同,所以编译通过,但运行时类型却不同,执行时出错。
二、 对象的equals()方法
equals()方法是在Object类中定义的方法,我们先看下源代码:
public boolean equals(Object obj) {
if(this==obj) return true;
else return false;
}
可以看出和操作符“==”的用法是一样的:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false。
但JDK中有一些类覆盖了Object的equals()方法:如果两个对象的类型一致,并且内容一致,则返回true。
这些类包括:java.io.File 、java.util.Date 、java.lang.String 、包装类(如java.lang.Integer 、java.lang.Double等)。
Integer int1 = new Integer(1);
Integer int2 = new Integer(1);
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(int1==int2); //打印false
System.out.println(int1.equals(int2)); //打印true
System.out.println(str1==str2); //打印false
System.out.println(str1.equals(str2)); //打印true