一、"=="
1. 自动转型到精度更高的类型后进行比较
int it = 65;
float fl = 65.0f;
System.out.println(“65 和 65.0f 是否相等?” + (it == fl));//true
2. char的本质是字符对应的ASCII码值
char ch1 = ‘A’; char ch2 = 12;
System.out.println(“65 和‘A’是否相等?” + (it == ch1));//T
System.out.println(“12 和 ch2 是否相等?” + (12 == ch2));//T
3. 地址不同,内容相同
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1 和 str2 是否相等?"+ (str1 == str2)); //F
System.out.println(“str1 是否 equals str2?”+(str1.equals(str2)));//T
二、equals()
Object的equals()源码:
equals()方法底层依赖的是"==",所以在没有重写equals()方法的子类中,调用equals()方法其实和使用"=="的效果一样,即比较的是地址值(是否为同一个对象)。
实际应用中,子类通常会对equals方法进行重写,用来比较指向的对象所存储的内容是否相等。
public boolean equals(Object obj) {
return (this == obj);
}
String的equals():
public boolean equals(Object anObject) {
if (this == anObject) {//如果是同一个对象
return true;//返回 true
}
if (anObject instanceof String) {//判断类型
String anotherString = (String)anObject;//向下转型
int n = value.length;
if (n == anotherString.value.length) {//如果长度相同
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {//然后一个一个的比较字符
if (v1[i] != v2[i]) {
return false;
}
i++;
}
return true;//如果两个字符串的所有字符都相等,则返回 true
}
}
return false;//如果比较的不是字符串,则直接返回 false
}
Integer包装类的equals():
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
如何重写 equals 方法
要求:判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样(name、age、gender),则返回 true,反之 false。
public boolean equals(Object obj) {
//判断如果比较的两个对象是同一个对象,则直接返回 true
if(this == obj) {
return true;
}
//类型判断
if(obj instanceof Person) {//是 Person,我们才比较
//进行 向下转型, 因为我需要得到 obj 的各个属性
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
}
return false; //如果不是 Person ,则直接返回 false
}
参考:韩顺平java教程