-------android培训、java培训、期待与您交流! --------
equals方法与==操作符的异同
1. 引用类型比较引用(是否指向同一个对象);
例:Person p1=new Person(); Personp2=new Person();if(p1==p2){…}
2. 基本类型比较值;
例:int a=5; if(a==6){…}
注:用"=="进行比较时,符号两边的数据类型必须一致(可自动转换的基本数据类型除外),否则编译出错;
equals()方法:
equals()方法是Object类的方法,由于所有类都继承Object类,也就继承了equals()方法。只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。格式:obj1.equals(obj2)
特例:当用equals()方法进行比较时,对类File、String、Date及封装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象;原因:在这些类中覆盖了equals()方法。
为了更好的理解equals()方法和==操作符,我们用下面一段代码来说明它们的异同和特点.
public class equalsTest {
public static void main(String args[]) {
Person person1 = new Person("AA", 12);
Person person2 = new Person("AA", 12);
System.out.println(person1 == person2); // flase
System.out.println(person1.equals(person2));// flase
String str1 = new String("aaa");
String str2 = new String("aaa");
System.out.println(str1 == str2);// flase
System.out.println(str1.equals(str2));// true
String str3 = "bbb";
String str4 = "bbb";
System.out.println(str3 == str4);// true
System.out.println(str3.equals(str4));// true
equalsTest et = new equalsTest();
// System.out.println(et==person1);编译出错
}
}
class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
分析:
1.person1==person2和person1.equals(person2) 都返回flase是因为==操作符和equals()方法都判断person1和person2引用类型不是指向同一个对象,所以都返回flase.
2.str1 == str2和str1.equals(str2),前者返回false原因和1一样,str1和str2不是指向同一对象,而后者返回true是因为String,Date,File,及封装类类重写了equals方法, 是比较类型及内容而不考虑引用的是否为同一对象,内容相等则返回ture.
下面这是String类中重写的equals方法:
public boolean equals(Object anObject) {
if (this == anObject) {
return 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;
}
它首先判断传入的对象是同一对象,如果是,直接返回true,如果不是,再判断类型是否为String类型,如果是,强制转换传入的对象为String类型,并让其与当前对象的字符逐个对比.全部相同则返回ture.其它情况都返回flase.
3.str3==str4和str3.equals(str4)都返回ture;这个和2结果不同,原因是在内存中有一个字符串缓存池,在创建str3的时候把字符串bbb放入字符串缓存池中,等到创建str4的时候,会优先去缓存池中去找,如果要初始化的值和bbb字符串一样,则直接把字符串的引用地址赋给str4,所以==操作符和quals方法都判断两个变量指向同一对象,都返回ture.
4.// System.out.println(et==person1);编译出错 :是因为==操作符进行比较时,符号两边的数据类型必须可兼容(可自动转换).