Java中的 “==” 与 equals 的区别
1.“==”
在Java中有两大类数据类型,一类是基础数据类型共有八种分别是byte、 short、 int、 long、 float、 double、 char、boolean,另一类则是引用数据类型,例如String、Integer等等。
“ == ” 作为比较运算符,是用于比较两个值是否相等的,但是在比较基础数据类型和引用数据类型时是不一样的。
例如以下代码,两个基本类型作比较:
int a = 1;
int b = 1;
System.out.println(a == b);
我们可以看到返回结构为true,说明 a 和 b的值是相同的
那如果比较两个引用数据类型呢?
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
我们可以看到,s1 和 s2的值明明都是abc,但比较出来结果确是false,为什么呢?
我们这里new了两个String对象,两个对象存储的地址是不同的,就算是值相同比较出来的结果也一定是false,因为 “==”在比较引用数据类型时比较的是引用(地址)是否相同
综上所述:
“ == ” 在比较基本数据类型比较的是值是否相同,而在比较引用数据类型的时候则是比较引用是否相同。
equals
equals被定义在了Object类中,Object类是所有类的父类,也就是说所有类都继承于Object,这也是为什么所有类都是可以调用或重写Object中的方法的。
我们通过Object的源码可以看到,equals方法的底层实现仍然是 “ == ”
可为什么我们去比较字符串时用equals比较的是两个值是否相等呢,我们可以从String源码中获得答案。
前面说到,所有类都继承于Object类,那也就是说所有的Object子类都是可以重写Object中定义的方法的。这里String就是重写了父类的equals方法从而实现了值得比较,可以看到,进入到这个方法时会先比较引用(地址)是否相同,若地址相同值一定是相同得,随后进行类型判断,若传入得参数类型是String,则继续比较,否则会返回false,若为ture进入判断中将参数转为String类型,比较长度,长度一致则会去遍历字符数组(String底层实现是字符数组,这里就不过多赘述了),若字符串中每个字符都相等则返回true.这样就实现了值得比较。
接下来我们看在Integer中得equals方法是这样的
若参数类型一致则调用intValue方法将参数转为int类型进行比较。
综上所述:
equals方法在Object中定义,其底层还是用得“==”去实现的,但是有些对象,例如String、Integer等等,则是重写了equals方法实现了值得比较。