==操作符既可以用于比较基本类型数据,又可以在对象之间进行比较,equals方法则只能用于对象之间的比较。不能对==进行重载但是可以对equals方法进行重载。所以在对对象进行比较时,==只能用于判断俩个比较对象是否属于同一个引用,如果属于同一个引用则返回true,如果不是返回false,而在equals放啊中除了可以判断俩个比较对象是否属于同一个引用之外,还可以对equals方法进行重写,所以当我们自定义对象时,可以重写equals从而定义自己的equals方法。
在对String类型的对象进行比较时,如果采取==进行比较,则只有俩个变量属于同一个对象的引用时才会返回true,而equals方法的比较原则是只要俩个变量的内容相同则返回true。看如下例子
String s1 =new String("你好");
String s2 =new String("你好");
String s3=s1;
System.out.println(s1==s2);//false
System.out.println(s1==s3);//true
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s3));//true
s1和s2属于不同对象,==判断为false,而equals判断为true。因为String内重写了equals的方法,只要比较的对象内容相同就会返回true。s1和s3属于同一对象,内容也相同,所以都返回true
以下是String重写的equals方法
public boolean equals(Object anObject) {
if (this == anObject) { // 先比较对象 如果是同一个对象,就直接返回true
return 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;
}
}
return false;
}
小结
- ==操作符既可以用于比较基本的数据类型,也可以用于比较对象,而equals只可以用于对象之间的比较
- 在比较String类型的对象时,==操作符的原理只有两个变量是同一对象的引用时才会返回true,而equals方法只要两个变量的内容相同则返回true
- 其他类型的对象进行比较时,equals方法默认的原理是判断两者的内存地址是否相同,所以默认情况下与==操作符返回的结果相同,但是这里应该发现差别,也就是equals方法可以被重写—用户可以定制自己的equals方法,而==操作符不能被重写