chapter10 equals()方法介绍
Object中的equals方法代码如下:
public boolean equals(Object obj) {
return (this == obj);//判断这两个对象是否是同一个对象的指引,如果是,就会返回true,否则返回false
}
在String等包装类的equals方法中,经过了重写中,比较的是两个对象的内容是否相同,
注意在重写的时候,必须要发生向下转型,否则没有办法访问到当前这个对象的内容,从而没有办法进行判断两个对象的内容是否相同,代码如下:
public boolean equals(Object anObject) {//Object anObject = new String();向上转型,只能访问到父类中的成员,但是没有办法访问到子类特有成员
if (this == anObject) {
//如果anObject和当前的对象是同一个对象的指引(即他们的地址是相同的),那么就返回true
return true;
}
//如果他们的地址不同,那么就判断anObject是否为String的实例,如果是,那么就判断他们的内容是否相同
if (anObject instanceof String) {
/**
* 如果是String的实例,那么就向下转型,才可以判断他们的内容是否相同,如
* 果不向下转型,那么原来的anObject是String对象经过向上转型得来的,那么
* anObject是没有办法访问到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;
}
}
return false;//如果anObject不是当前String类的实例,那么就返回false,说明它的类型不是String
}
实例代码:
public class StringEquals {
public static void main(String[] args){
String s1 = new String("a");
String s2 = new String("a");
Integer x = new Integer(5);
Integer y = new Integer(5);
String s3 = s1;//当s1赋给s3的时候,那么s3指向的是a这个对象,和s1指向的对象是一样的,那么他们的地址一样
Object s4 = new Object();
Object s5 = new Object();
Object s6 = s4;
//当==比较的是两个引用类型的时候,那么==比较的是这两个引用类型的地址是否相同,如果相同,表明他们是同一个对象的指引,否则不是
System.out.println(s1 == s2);//输出false,每new一次,那么他们的地址就不一样
//字符串类型,那么他会重写Object类型的equals方法,从而他会比较两者的内容是否想相同
System.out.println(s1.equals(s2));//输出true
System.out.println(s1 == s3);//输出true
System.out.println(s1.equals(s3));//输出true
System.out.println(x == y);//输出false
//整形包装类,那么会重写Object类的equals方法,从而比较的两者的内容是否相同
System.out.println(x.equals(y));
System.out.println(s4.equals(s2));//Object.equals(String),比较的是两者的地址,输出false
System.out.println(s2.equals(s4));//String.equals(Object),,比较的是两者的内容,输出false
System.out.println(s4 == s5);//比较两个引用类型的地址是否相同
System.out.println(s4.equals(s5));//Object进行比较,那么equals比较的是两者的地址是否相同
System.out.println(s4 == s6);//输出true
}
}
结果:
综上所述,equals如果比较的两个对象都是Object,那么比较的是两者的地址是否相同,如果是Object.equals(String),那么equals的方法和比较两个对象都是Object的一样,都是比较两者的地址是否相同,是否指向同一个指引。如果String.equals(Object)和比较的两个对象都是String一样,比较的是两者的内容是否相同。
equals和==的区别:
①对于基本类型的变量来说(如 short、 int、 long、 float、 double),只能使用 == ,因为这些基本类型的变量没有 equals 方法。对于基本类型变量的比较,使用 == 比较, 一般比较的是它们的值。
②对于引用类型(类、数组、接口)的变量来说,可以使用==来比较他们的地址是否相同,如果使用equals时,默认情况下,也就是没有复写 Object 类的 equals 方法,那么使用 == 和 equals 比较是一样效果的,都是比较的是它们地址是否相同,但是如果重写了equals方法,那么比较的就是它们的内容是否相同。
③进行字符串的比较时,一般都是用equals来进行比较,而对于基本类型的比较,一般是用==来进行比较的。
上一篇: chapter11 多线程(一)
下一篇: D2之淘宝技术沙龙