在编写代码的过程中,我们经常会遇到当前的equals和==之间的使用,但是,为了弄懂当前的两者之间的关系,我们将分析Object类中的equals方法 和 String类中的equals方法进行解析。
1、Object 中的equals()方法:
(1)通过查找API,说明如下:
equals
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在 非空对象引用 上实现相等关系:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z)
应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals
比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何 非空引用值 x 和 y,
当且仅当 x 和 y 引用同一个对象 时,此方法才返回 true( x == y 具有值 true )。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,
该协定声明相 等对象必须具有相等的哈希码。
参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
public
boolean
equals(Object obj) {
return
(
this
== obj);
}
2、String中的equals()方法:
(1)通过查找API,说明如下:
equals
public boolean equals(Object anObject)将此字符串与指定的对象比较。
当且仅当该参数不为 null ,并且是 与此 对象表示相同字符序列 的 String 对象时,结果才为 true。
覆盖:
类 Object 中的 equals
参数:
anObject - 与此 String 进行比较的对象。
返回:
如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false。
public boolean equals(Object anObject) {
如果当前对象和传进来要进行比较的对象anObject是同一个对象(即地址相同eg同一辆汽车(只有一辆))则返回true
// 判断当前的两个字符串的内容是否一致
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
测试代码如下:
private static void testEquals(){
int a = 5;
int b = 5;
System.out.println(a == b);
String aaString = new String("Hello");
String bbString = new String("Hello");
System.out.println(aaString == bbString);
System.out.println(aaString.equals(bbString));
System.out.println("------print the non string type -------");
Home homeA = new Home();
homeA.setDerection(1);
homeA.setPostion(1);
Home homeB = new Home();
homeB.setDerection(1);
homeB.setPostion(1);
System.out.println(homeA == homeB);
System.out.println(homeA.equals(homeB));
}其中当前的Home类如下:
public class Home {
private int postion;
private int derection;
private volatile int hashCode;
public int getPostion() {
return postion;
}
public void setPostion(int postion) {
this.postion = postion;
}
public int getDerection() {
return derection;
}
public void setDerection(int derection) {
this.derection = derection;
}}
打印结果如下:
true
false
true
------print the non string type -------
falsetrue
于是,得到如下结论:
1、对于基本数据类型,“==”比较的是两者的值是否相等。
2、对于引用数据类型,(1)“==”比较的是引用的地址是否相同(即是否是 同一辆 汽车(注意, 只有一辆 汽车));
Object中的.equals()方法和"==’功能一样
(2)但是String类中的.equals()方法重写了,比较的是两个引用对象的 内容 是否想同