原创文章,转载请标注:https://blog.csdn.net/loubing1990/article/details/80173100
要知道它们的区别,先要知道到java中有哪些类型,java中有基本数据类型和引用数据类型,其中基本数据类型有byte、char、short、int、long、float、double、boolean,那引用数据类型就不用说了。
先说“==”的用途
举例:
int a1 = 1; int a2 = 1; System.out.println(a1==a2);打印结果为true。
引用类型,用Object举例
Object a = new Object(); Object b = a; Object c = a; System.out.println(b==c);返回的是true。
Integer b1 = new Integer(2); Integer b2 = new Integer(2); System.out.println(b1==b2);返回结果为false。
这说明“==”对于基本数据类型比较的是变量值,对于引用数据类型,比较的是引用,就是说它们引用的是否是同一个对象。
那么再说说equals
我们知道所有的类最顶层的父类是Object,而Object类有一个equals方法,它的源码是这样的
public boolean equals(Object obj) { return (this == obj); }也就是说对于equals来说,其实比较的是两个类的引用,也就是说它们引用的是否是用一个对象。现在看起来好像是这么一个规律,好像Object的所有子类的equals都是比较的是否同一个对象,但其实不是这样的,Object的子类有可能会重写equals方法,我就是最经典的String类,看看它是怎样重写的。
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }如果是同一个对象,自然返回的是true,如果不是同一个对象,就先判断被比较的是不是String类型,如果是,就比较他们的值,否则返回false。我还是写点测试代码吧
String c1 = new String("a"); String c2 = c1; String c3 = new String("a"); System.out.println(c2.equals(c3));返回结果是true。c2==c1肯定没问题吧,c1和c3是不同的对象对吧。用c2.equals(c3)相当于用c1.equals(c3),那着不同的对象equals比较得到的是true。也就是说它们会比较值是否相等。
再举个例子,Integer里面的equals源码看看
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }它直接是判断值,都不用判断是不是同一个对象。
那现在试着总结一下规律,“==”对于基本数据类型,判断的是否是同一个值,对于引用类型判断的是否是同一个对象,“equals”只有引用数据类型有这个方法,它的比较先看有没有重写,有重写的要根据重写的去看看比较什么,否则就是比较是不是同一个对象。
似乎总结完了?再想想,我们平时定义一个String变量,可能不是去new String(),可能直接是String a = "xxx";那我们直接看案例吧,如下代码:
String c1 = new String("a"); String c2 = new String("a"); System.out.println(c1==c2); System.out.println(c1.equals(c2)); String c3 = "a"; String c4 = "a"; System.out.println(c3==c4); System.out.println(c3.equals(c4));得到的结果是:
false
true
true
true
说明如果类引用直接是一个值,在相同作用域下进行比较的话,不管是“==”还是“equals”都是比较的值,我可以再验证一下,如代码:
Integer b1 = new Integer(2); Integer b2 = new Integer(2); System.out.println(b1==b2); System.out.println(b1.equals(b2)); Integer b3 = 2; Integer b4 = 2; System.out.println(b3==b4); System.out.println(b3.equals(b4));得到的结果也是
false
true
true
true
是不是和上面的结果一样呀
好,如果大家不反对,我就总结一下。
“==”对于基本数据类型,在相同的作用域下,判断的是值是否相等,对于引用类型,如果引用的是对象,就判断是否是同一个对象,如果引用的直接是一个值,在相同的作用域下,就判断值是否相等,“equals”只有引用数据类型有这个方法,如果是引用的对象,它的比较先看有没有重写,有重写的要根据重写的去看看比较什么,否则就是比较是不是同一个对象,如果引用的是一个值,在相同的作用域下,就直接判断值是否相等。
注意一下,上面总结凡是涉及到值的判断,我都加了一个在相同的作用域下,是因为这些变量的判断必须在同一个作用域下才能比较。
下面我用一个流程图说清楚他们之间的关系
差不多到这里吧,我很少写一些技术总结的文章,文笔比较差,然后上面的总结有错误希望大家指出来,免得误导大家,然后也可以交流交流技术,谢谢。
