介绍
首先==和equals可以比较基础数据类型,比如int a =1,也可以比较引用数据类型,比如Object a = new Object(),
那我们就分别看一下在比较基础数据类型和引用数据类型时有什么区别.
分析
这是一道常见的面试题,要明白==和equals的区别,先看一下源码,equals是Object类的方法,看一下Object类的源码.
public boolean equals(Object obj) { return (this == obj); }
可以看到在Object类中也是调用==方法,由于所有的类都继承自Object类,只要不重写equals方法,equals和==是一样的,因此可以得到结论1:
对于所有没有重写equals方法的类,equals方法和==是一样的,没有任何区别,无论是比较引用类型还是基础数据类型.
那么对于重写了equals方法的类呢,String,Integer类都重写了,我们以String类为例子,来看一下String类的源码.
可以看到String类把传进来的String对象和自己转换成字符数组,然后再依次比较两者是否相等,也就是说比较两者的内容是否相等,而不是去比较地址.
Integer类同理,也是比较值是否相等,而不是去比较地址了.
我们测试一下:
public class Test3 { public static void main(String[] args) { String s1 = "abc"; String s2 = new String("abc"); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); } }
对于s1和s2两者内容相同,但是地址不一样,因此==输出为flase,equals输出为true.因此String的equals是比较字符串内容是否一样.
总结:
1.对于基础数据类型:equals和==是一样的,比较的就是基本类型的值
2.对于引用类型:如果没有重写equals方法,equals和==是一样的,比较的是引用类型指向的地址是否一致.
如果重写了equals方法,那么equals是比较内容是否一致,==比较地址是否一致.