== 运算符
== 既可以用于基本数据类型的比较,也可以用于引用数据类型的比较
(1)如果比较的是基本数据类型变量:比较两个变量的值是否相等,相等即为true
注意:当基本数据类型进行比较时,符号两边的数据必须类型兼容(类型相同或可自动类型转换),否则编译出错。
测试代码:
public class EqualsTest {
public static void main(String[] args) {
//基本数据类型
int i = 10;
int j = 10;
float f = 10.0f;
System.out.println(i == j);//true
System.out.println(i == f);//true
char c = 10;
System.out.println(i == c);//true
char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2);//true
/*
boolean b = true;
System.out.println(b == i);//类型不兼容,不能进行自动类型转换,编译不通过,不能进行比较
*/
}
}
(2))如果比较的是引用数据类型变量:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体
注意:当引用数据类型进行比较时,符号两边的数据类型必须兼容(类型相同或有父子类关系),否则编译不通过。
代码示例:
class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class EqualsTest {
public static void main(String[] args) {
//引用数据类型比较
Person p1 = new Person("Tom", 18);
Person p2 = new Person("Tom", 18);
System.out.println(p1 == p2);//false
String str1 = new String("Java");
String str2 = new String("Java");
System.out.println(str1 == str2);//false
/*
Person p = new Person();
String str = "hello";
System.out.println(p == str);//Person和String类型无父子类关系,类型不兼容,不能进行比较
*/
}
}
equals(Object obj) 方法
equals(Object obj)方法只能用于引用数据类型比较,最初是在Object类中定义的:
public boolean equals(Object obj) {
return (this == obj);
}
Object类中定义的equals方法和 == 的作用是相同的:比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体。如果一个类型没有重写equals方法,那么调用equals等价于 ==。
像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后,比较的是两个对象的类型和"实体内容"是否相同,而不考虑引用的是否是同一个对象。
class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class EqualsTest {
public static void main(String[] args) {
//引用数据类型比较
Person p1 = new Person("Tom", 18);
Person p2 = new Person("Tom", 18);
System.out.println(p1.equals(p2));//false,Person类没有重写equals方法,比较的是对象的地址
String str1 = new String("Java");
String str2 = new String("Java");
System.out.println(str1.equals(str2));//true,String类重写了equals方法,比较内容
Date date1 = new Date(4512574565L);
Date date2 = new Date(4512574565L);
System.out.println(date1.equals(date2));//true,Date类重写了equals方法,比较内容
}
}
自定义类中要根据有没有重写Object类的equals方法来判断;通常情况下,重写equals方法会比较类中的相应属性值是否都相同。