java中==和equals的区别

xiaoxiao2021-02-28  39

原创文章,转载请标注: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”只有引用数据类型有这个方法,如果是引用的对象,它的比较先看有没有重写,有重写的要根据重写的去看看比较什么,否则就是比较是不是同一个对象,如果引用的是一个值,在相同的作用域下,就直接判断值是否相等。

 

注意一下,上面总结凡是涉及到值的判断,我都加了一个在相同的作用域下,是因为这些变量的判断必须在同一个作用域下才能比较。

 

下面我用一个流程图说清楚他们之间的关系

 

差不多到这里吧,我很少写一些技术总结的文章,文笔比较差,然后上面的总结有错误希望大家指出来,免得误导大家,然后也可以交流交流技术,谢谢。

转载请注明原文地址: https://www.6miu.com/read-2625789.html

最新回复(0)