黑马程序员--equals方法与==操作符的异同

来源:互联网 发布:博物馆软件 编辑:程序博客网 时间:2024/06/05 04:28



 -------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));// trueString str3 = "bbb";String str4 = "bbb";System.out.println(str3 == str4);// trueSystem.out.println(str3.equals(str4));// trueequalsTest 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);编译出错 :是因为==操作符进行比较时,符号两边的数据类型必须可兼容(可自动转换).


0 0
原创粉丝点击