北大青鸟(上海云登)授权培训中心
软件开发 | 网络技术实训基地北大青鸟江老师
咨询电话:021-61113200、13122651497
您现在的位置:上海北大青鸟 > 学员天地 > 技术文章 >

Java中的“==”和“equals”异同

发布日期:2013-07-25 13:11

 
        不少Java方面的基础面试题中,都会有这么一道看似很简单,而实际上要真正解释清楚,似乎却又不是那么简单的问题。下面,我们就来分析一下,这两者之间的异同。
 
        首先,先来看看相同点。“==”是一个运算符,作用是对符号两边的内容进行比较,由“==”运算符连接的表达式,最后会返回一个布尔类型的值,即“true&r”或者“false”;而equals是一个方法,该方法的作用,是对调用该方法的对象,和传入方法中的参数做一个比较,最后,方法返回的,也是一个布尔值。所以从以上分析可以看出,两者的相同点有两处:一、都用作比较;二、都返回布尔值。另外,这两者还有一个相同的地方,那就是在Object类的源代码中,定义的equals方法的方法体为:return this==obj,此处obj为传入方法的参数。可见,在原始的定义中,“equals”和“==”的返回结果其实是一致的。
 
        接下来,来看看两者的区别:首先,最显著的区别就是,“==”是一个运算符,而“equals”是一个方法,两者本就分属异类,互不相同。而由这一点,又引发出了两个不同点:第一、Java里的数据类型,概括来说,可以分成两个大类:基本数据类型和对象。那么“==”作为一个运算符,对于这两类数据都可以通用,而“equals”作为一个方法,只能由对象来调用,对于基本数据类型是奈何不得的;第二、“equals”作为Object类中定义的一个方法,可以在派生出的任何子类中进行重写,所以可以根据自己的需要,去重新定义equals这个方法,然而,Java里并不支持运算符的重载,所以“==”就只能始终保持着原本的意义。所以这也就解释了,为什么对于String a=new String(“abc”);String b=new String(“abc”);当执行System.out.print(a==b)时,输出为false,而在执行System.out.print(a.equals(b))时,输出的是true。因为,“==”对于对象来说,所比较的是两变量是否引用的同一对象,显然,通过两个new关键字产生的两个字符串,在内存中是存储于不同地址中的两个不同对象,于是a==b的结果就是false。而对于equals方法来说,String类重写了它,使得它对于调用对象和参数之间的比较,基于值的层面,也就是说,只要两个字符串的值相等,就返回true,而不去在意是否引用同一对象。