目录
一、==
- 是运算符,既可以比较基本数据类型也可以比较引用数据类型。
- 基本数据类型:比较值(不一定类型要相同),
- 引用数据类型:比较内存地址是否相同,即两个引用是否指向同一个对象实体
- 使用时,必须保证左右两边的变量类型一致
二、equals()方法的使用
(一)使用:
- 是方法而非运算符
- 只能适用于引用数据类型
①在Object类中与 == 作用相同,比较地址值,定义如下:
②在String、Date、File、包装类等类中被重写,比较两个对象的实体内容是否相同,定义如下:
import java.util.Date;
public class EqualsTest {
public static void main(String[] args) {
int i = 10;
int j = 10;
double d = 10;
System.out.println(i == j); //true
System.out.println(d == i); //true 存在自动类型提升
boolean b = true;
// System.out.println(b == i); 未对参数类型 boolean, int 定义运算符 ==
char c = 10;
System.out.println(c == i); //true
char c1 = 'A';
char c2 = 65;
System.out.println(c1 == c2);//true
Customer cust1 = new Customer("Tom",21);
Customer cust2 = new Customer("Tom",21);
System.out.println(cust1 == cust2); //false 比较地址值
String str1 = new String("atBaiDu");
String str2 = new String("atBaiDu");
System.out.println(str1 == str2); //false
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
System.out.println(cust1.equals(cust2)); //false boolean java.lang.Object.equals(Object obj)
System.out.println(str1.equals(str2)); //true boolean java.lang.String.equals(Object anObject)
Date date1 = new Date(56457485454L);
Date date2 = new Date(56457485454L);
System.out.println(date1.equals(date2)); //true
}
}
(二)重写equals方法
通常情况下,我们自定义的类如果使用equals()的话,也通常比较两个对象的“实体内容”是否相同。那么,就需要对Object类中的equals()进行重写
①手动实现
//手动实现equals重写
//重写的原则:比较两个对象的实体内容(即name和age)是否相同
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj instanceof Customer) {
Customer cust = (Customer)obj;
//比较两个对象的每个属性是否都相同
// if(this.age == cust.age && this.name.equals(cust.name)) {//引用数据类型记得用equals
// return true;
// }else {
// return false;
// }
//或
return this.age == cust.age && this.name.equals(cust.name);
}else {
return false;
}
}
}
②自动生成
③重写equals的规则
三、练习题
练习1
package exer2;
public class OrderTest {
public static void main(String[] args) {
Order order1 = new Order(1001,"AA");
Order order2 = new Order(1001,"BB");
System.out.println(order1.equals(order2)); //false
Order order3 = new Order(1001,"BB");
System.out.println(order2.equals(order3)); //true
}
}
class Order{
private int orderId;
private String orderName;
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public Order(int orderId, String orderName) {
super();
this.orderId = orderId;
this.orderName = orderName;
}
@Override //重写的equals方法
public boolean equals(Object obj) {
if(this == obj) { //比较地址
return true;
}
if(obj instanceof Order) {
Order order = (Order)obj;
return this.orderId == order.orderId && this.orderName.equals(order.orderName);
}
return false;
}
}
练习2
package exer2;
public class MyDateTest {
public static void main(String[] args) {
MyDate m1 = new MyDate(14,3,1976);
MyDate m2 = new MyDate(14,3,1976);
if(m1 == m2) {
System.out.println("m1 == m2");
}else {
System.out.println("m1 != m2");
}
if(m1.equals(m2)) {
System.out.println("m1 is equal to m2");
}else {
System.out.println("m1 is not equal to m2");
}
}
}
class MyDate{
private int day;
private int month;
private int year;
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public MyDate(int day, int month, int year) {
super();
this.day = day;
this.month = month;
this.year = year;
}
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj instanceof MyDate) {
MyDate mydate = (MyDate)obj;
return this.day == mydate.day && this.month == mydate.month && this.year == mydate.year;
}
return false;
}
}