码迷,mamicode.com
首页 > 其他好文 > 详细

由equals和==不同,而引发的知识点补习

时间:2018-02-17 22:06:18      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:调用   构造   system   log   情况   ...   不同的   int   alt   

  在复习JavaSE基础时,看到Object类中的equals方法与==的对比,原文中是这么讲的:“两个内建类型的数值进行比较是否相等时,使用“==”,但当比较两个对象的时候,可以使用“==”或equals方法,这俩方法有区别,

区别在于,equals方法比较的是引用变量指向的对象的值,==比较的是两个对象在内存中的地址。

  内存地址、对象空间、变量......对象存在哪?变量存在哪?对象空间指的是什么?一脸茫然 = =||

  由此,先回顾一下对象创建的概念。创建完一个类后,就创建了一种新的数据类型,可以使用这种类型来声明该类型的对象,获取一个类对象,一般需要两个步骤:

  1、声明该类类型的一个变量,它只是一个能够引用对象的简单变量,存储在栈中;

  2、在堆内存中为该对象分配地址空间,并把该对象的引用赋给该变量,通过new运算完成。在java中,所有类对象,都必须动态分配。

Rectangle rectangle;
rectangle = new Rectangle(3,5);

  详细过程如下:

(1) 执行Rectangle rectangle,系统为引用类型变量rectangle分配内存空间,此时只是定义了变量,并未进行初始化工作。

技术分享图片

(2) 执行rectangle = new Rectangle(3,5),先调用构造方法,创建一个Rectangle类的对象,即为该对象分配内存空间,来存储该对象的所有属性,并对各属性的值进行初始化,此时内存中情况如下:

技术分享图片

(3) 接下来执行Rectangle的构造方法,继续对新对象初始化工作,构造方法中对新构造的对象的成员变量进行赋值,width和length的值变成3和5。

 技术分享图片

(4) ==进行赋值操作,将新建的对象内存空间地址的首地址,赋值给Rectangle类型的变量rectangle

技术分享图片

  由此,可以形象的看出变量和对象关系,回到之前讨论的equals方法中。equals()和“==”操作用于对象的比较,检查俩对象的相等性,他们俩的主要区别在于:

1、前者是方法,后者是操作符。由于Java不支持操作符重载(overloading),“==”的行为对于每个对象来说与equals()是完全相同的,但是equals()可以基于业务规则的不同而重写(overridden )。

2、另一个需要注意的不同点是“==”习惯用于原生(primitive)类型之间的比较,而equals()仅用于对象之间的比较。同时初学者奋力地想找到什么时候使用等号操作“==”,什么时候使用equals方法。

  “==”等号操作是什么   

  “==”或等号操作在Java编程语言中是一个二元操作符,用于比较原生类型和对象。就原生类型如boolean、int、float来说,使用“==”来比较两者,这个很好掌握。但是在比较对象的时候,就会与equals()造成困惑。

“==”对比两个对象基于内存引用,如果两个对象的引用完全相同(指向同一个对象)时,“==”操作将返回true,否则返回false。

  什么是equals方法   

  equals()方法定义在Object类里面,根据具体的业务逻辑来定义该方法,用于检查两个对象的相等性。例如:两个Employees被认为是相等的如果他们有相同的empId的话,你可以在你自己的domain对象中重写equals方法用于比较哪两个对象相等。equals与hashcode是有契约的(无论什么时候你重写了equals方法,你同样要重写hashcode()方法),默认的equals方法实现是与“==”操作一样的,基于业务需求重写equals方法是最好的实践之一,同样equals与compareTo保持一致也不足为奇,以至于存储对象在Treemap或treeset集合中时,将使用compareTo方法检查相等性,行为是一致的。

  ==与equals方法的区别   

  ==与equals的主要区别是:==常用于比较原生类型,而equals()方法用于检查对象的相等性。另一个不同的点是:如果==和equals()用于比较对象,当两个引用地址相同,==返回true。

  equals()可以返回true或者false主要取决于重写实现。最常见的一个例子,字符串的比较,不同情况==和equals()返回不同的结果。

 

字符串的比较是一个常见的情景,因为java.lang.String类重写了equals方法,它返回true如果两个字符串对象包含有相同的内容,但是==只有他们的引用地址相同时才返回true,下面这个例子就是通过==和equals方法分别比较两个字符串。

 

 1     String personalLoan = new String("cheap personal loans");
 2     String homeLoan = new String("cheap personal loans");   
 3     //since two strings are different object result should be false boolean result = personalLoan == homeLoan;
 4     System.out.println("Comparing two strings with == operator: " + result);   
 5     //since strings contains same content , equals() should return true result = personalLoan.equals(homeLoan);
 6     System.out.println("Comparing two Strings with same content using equals method: " + result);
 7     homeLoan = personalLoan; 
 8     //since both homeLoan and personalLoand reference variable are pointing to same object 
 9     //"==" should return true result = (personalLoan == homeLoan); 
10     System.out.println("Comparing two reference pointing to same String with == operator: " + result);   
11     Output: 
12     Comparing two strings with == operator: false 
13     Comparing two Strings with same content using equals method: true 
14     Comparing two reference pointing to same String with == operator: true

 

==与equals在对象之间的对比  

另一中情景是:当你对比两个对象时,在选择==和equals方法中很容易困惑,当你比较的两个引用指向的对象是Object的类型的时候,那么你看到的结果和==是一致的,因为默认的equals方法实现仅仅比较的内存地址。

如果两个引用变量完全指向的是同一个对象的话就返回true,下面这个例子是equals和==方法操作比较的是两个对象。

 1 Object obj1 = new Object(); Object obj2 = new Object();   
 2 // == should return false result = (obj1==obj2); 
 3 System.out.println("Comparing two different Objects with == operator: " + result);   
 4 //equals should return false because obj1 and obj2 are different result = obj1.equals(obj2); 
 5 System.out.println("Comparing two different Objects with equals() method: " + result);   
 6 // "==" should return true because both obj1 and obj2 points same object obj1=obj2; result = (obj1==obj2); 
 7 System.out.println("Comparing two reference pointing to same Object with == operator: " + result);   
 8 Output: 
 9 Comparing two different Objects with == operator: false 
10 Comparing two different Objects with equals() method: false 
11 Comparing two reference pointing to same Object with == operator: true

总结:

  1.  使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。
  2.   ==返回true如果两个引用指向相同的对象,equals()的返回结果依赖于具体业务实现
  3.  字符串的对比使用equals()代替==操作符

  以上就是关于equals方法和==操作符的区别,其主要的不同是一个是操作符一个是方法,==用于对比原生类型而equals()方法比较对象的相等性。

 

由equals和==不同,而引发的知识点补习

标签:调用   构造   system   log   情况   ...   不同的   int   alt   

原文地址:https://www.cnblogs.com/kunpengv5/p/8452204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!