"=="比较运算符
首先我们重温一下一直在使用的"=="比较运算符
1)== :比较运算符,既可以判断基本类型,又可以判断引用类型
2)== :比较运算符,如果判断基本类型,判断的是值是否相等。示例:int i=10; double d=10.0; i==d true
3)== :比较运算符,如果判断引用类型,判断的是地址是否相等.
equals方法
equals: 是Object类中的方法,只能判断引用类型,判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如Integer,String .... 直接上案例
简单案例
注意案例中的源码
package object;
/**
* equals与==的区别:
* equals 与 == 相同的作用,在Object.equals没有被子类重写之前。
* 但 equals 通常用于比较引用类型变量,==通常用于比较基本数据类型变量。
* 不管是equals 还是 == ,比较引用类型变量时,都是比较引用地址是否相等。
* 对于基本类型而言,equals和== 都是比较大小是否相等
* Object的子类大多都会重写equals方法, 例如String ,Integer....
*
*/
public class ClassTest {
public static void main(String[] args) {
//查看Object中equals源码 (ctrl + 左键) 点击进入源码
Object object = new Object();
System.out.println(object.equals(new String("hello"))); //F
/* Object.equals 源码 :
* public boolean equals(Object obj) {
return (this == obj);
}
*/
String st1 = new String("hello");
String st2 = new String("hello");
System.out.println(st1 == st2); //F
//String 子类重写了 Object父类的 equals方法
System.out.println(st1.equals(st2)); //T
//使用String的equals方法比较一个对象与一个常量时,尽量使用,常量.equals
System.out.println("hello".equals(st2)); //T 这样可以避免空指针异常
// String.equals源码:
/*
* public boolean equals(Object anObject) {
if (this == anObject) { //如果是同一个对象,返回true
return true;
}
if (anObject instanceof String) {
//如果是String类型或其父类,进入if判断内容
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
//如果长度相等,将两个字符串保存入char数组中,逐个字符进行比较
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
//只要有一个字符不相同 就返回false
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
*/
}
}
简单案例2
package object;
/**
* 重写equals方法,实现比较两个Person对象的所有属性是否相同,若相同返回true
*/
public class OverrideEquals {
public static void main(String[] args) {
Person person1 = new Person("小范",20,'A');
Person person2 = new Person("小范",20,'A');
Person person3 = new Person("小黄",18,'A');
Object object = new Object();
System.out.println(person1 == person2); //F 比较地址
System.out.println(person1.equals(person2)); //T 比较属性值
System.out.println(person1.equals(person3)); //F
System.out.println(person1.equals(object)); //F
}
}
class Person{
private String name;
private int age;
private char gander; //等级
public Person(String name, int age, char gander) {
super();
this.name = name;
this.age = age;
this.gander = gander;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGander() {
return gander;
}
public void setGander(char gander) {
this.gander = gander;
}
public boolean equals(Person p) {
boolean flag = false;
if(this == p) { //是同一个对象
flag = true;
}else {
if (this.name.equals(p.getName())) {
if(this.age == p.getAge()) {
if(this.gander == p.getGander()) {
flag = true;
}
}
}
}
return flag;
}
// alt + shift + s ==> h 自动生成重写后的equals
// 对比自动生成的,看自己重写的。比较区别,明显自己的重写equals有bug
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (gander != other.gander)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
应用案例
在自己定义的类中重写equals方法
package object;
/**
* 编写Order类,有int型的orderId,String型的OrderName,private属性。
相应的getter()和setter()方法,两个参数的构造器,
重写父类的equals()方法:public boolean equals(Object obj),
并判断测试类中创建的两个对象是否相等。
属性是否相同, 相同返回 t, 否则返回 False.
*
*/
public class ClassWork {
public static void main(String[] args) {
Order order1 = new Order(1001, "小范");
Order order2 = new Order(1001, "小范");
Order order3 = new Order(1002, "小黄");
System.out.println(order1.equals(order2)); //T
System.out.println(order1.equals(order3)); //F
}
}
class Order{
private int orderId;
private String orderName;
public Order(int orderId, String orderName) {
super();
this.orderId = orderId;
this.orderName = 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 boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(!(obj instanceof Order)) {
//不是Order类型
return false;
}
//由于已经判断过Order类型,所以这里向下转型一定不会报错
Order other = (Order)obj;
return other.orderId == this.orderId && other.orderName.equals(this.orderName);
}
}