本文从多篇博客笔记融合而来,系转载,非原创,参考:

1.  http://www.cnblogs.com/e241138/archive/2012/09/16/2687981.html

2.  http://blog.csdn.net/xiaoya629/article/details/5549159

3.《疯狂java讲义》

一、 关于==和equals方法

Java中判断变量相等一般使用==运算符和equals方法。

其中,关于“==”,当我们使用==来比较基本数据类型时,比较的是其值,只要他们的值相同,==就可以返回true。当用==比较引用类型时,比较的是的地址,二者是否引用同一个堆内存空间,如果是,则返回true。即便二引用变量引用的堆内存中的内容完全相同,只要是不同的两个堆内存,也只会返回false。

而equals是Object中的方法,用来比较留个对象是否相等,程序员可以通过覆写该方法,定义自己的对象比较规则。String类已经覆写了该方法,用于比较字符串序列内容是否相等。

如果我们自定义了某个类,且此类需要进行对像是否相同的比较,那我们需要覆写equals方法,定义自己的比较规则,而不能直接调用Object的equals方法。

二、 ==比较运算符

   ==比较的是两个基本数据类型的值是否相等,或者两个对象的引用地址是否一样。

如下代码:

  1. public static void main(String args[]) {
  2. int a = 1000, b = 1000;
  3. System.out.println(a == b);
  4.  
  5. Integer c = 1000, d = 1000;
  6. System.out.println(c == d);
  7.  
  8. Integer e = 100, f = 100;
  9. System.out.println(e == f);
  10. }

运行的结果为:true   false   true



原因:



(1)a和b都是基本数据类型,值也相等,所以 a==b 为true



(2)Integer c = 1000 是将一个基本数据类型的值赋给对象的引用。这里涉及到了装箱的概念,



   就是把把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。



   编译器用的是public static Integer valueOf(int i)方法。



    来看下它的源码:

  1. public static Integer valueOf(int i) {
  2. final int offset = 128;
  3. if (i >= -128 && i <= 127) { // must cache
  4. return IntegerCache.cache[i + offset];
  5. }
  6. return new Integer(i);
  7. }

当i的值在[-128,127]之间时,返回的是IntegerCache缓存的对象的已用,否则返回的是新的对象的引用。

因此,c 和 d 是两个不同的对象, e 和 f 是两个相同的对象。

通过调试也可以看到他们的id值也说明了这一点。

所以,c==d 为 false ,e==f 为 true。

三、 equals运算符

equals比较的是两个对象是否相等。由于每个类都是使用Object作为超类的,所以所有对象(包括数组)也实现这个类方法。

对于Object类的equals方法源代码如下:

public boolean equals(Object obj) {

    return (this == obj);

}

可以看到它调用的就是 == 比较运算符。因此下面的代码结果就很容易看出为false了。

覆写equals判断对象是否相同需要注意以下几点:

1. equals的参数类型应该为Object,Object可以接收一切类型的对象;

2. 接受之可以先通过==进行判断,看二对象应用的地址是否相同,相同则直接返回true;

3.在以上不成立的情况下进行进一步判断。通过instanceof判断此对象是否是此类的实例。同一个类的实例才可以进行比较,不同类的实例自然不会相同。

4.最后对两对象的每个属性的值进行比较,相同则两对象相同,不同则两对象不同。

现按以上思路覆写equals方法,代码如下:

  1. class Person
  2. {
  3. private String name;
  4. private String idStr;
  5. public Person(){}
  6. public Person(String name , String idStr)
  7. {
  8. this.name = name;
  9. this.idStr = idStr;
  10. }
  11. //此处省略name和idStr的setter和getter方法。
  12. //name属性的setter和getter方法
  13. public void setName(String name)
  14. {
  15. this.name = name;
  16. }
  17. public String getName()
  18. {
  19. return this.name;
  20. }
  21.  
  22. //idStr属性的setter和getter方法
  23. public void setIdStr(String idStr)
  24. {
  25. this.idStr = idStr;
  26. }
  27. public String getIdStr()
  28. {
  29. return this.idStr;
  30. }
  31. //重写equals方法,提供自定义的相等标准
  32. public boolean equals(Object obj)
  33. {
  34. // 如果两个对象为同一个对象
  35. if (this == obj)
  36. return true;
  37. //只有当obj是Person对象
  38. if (obj != null && obj.getClass() == Person.class)
  39. {
  40. Person personObj = (Person)obj;
  41. //并且当前对象的idStr与obj对象的idStr相等才可判断两个对象相等
  42. if (this.getIdStr().equals(personObj.getIdStr()))
  43. {
  44. return true;
  45. }
  46. }
  47. return false;
  48. }
  49. }
  50. public class OverrideEqualsRight
  51. {
  52. public static void main(String[] args)
  53. {
  54. Person p1 = new Person("孙悟空" , "12343433433");
  55. Person p2 = new Person("孙行者" , "12343433433");
  56. Person p3 = new Person("孙悟饭" , "99933433");
  57. //p1和p2的idStr相等,所以输出true
  58. System.out.println("p1和p2是否相等?"
  59. + p1.equals(p2));
  60. //p2和p3的idStr不相等,所以输出false
  61. System.out.println("p2和p3是否相等?"
  62. + p2.equals(p3));
  63. }
  64. }

程序输出:



总结:

    1. ==通常用于判断基本类型数据是否相等; 等它用于比较引用类型数据时,表示比较的引用变量所指向的堆内存空间是一致的。

    2. equals方法是Object中的,用于比较两个对象是否相等; 程序员可以通过覆写该方法,定义自己的对象比较规则。







深入java面向对象一:==和equals详解的更多相关文章

  1. Java面向对象之各种变量详解

    在Java中一定有很多变量让大家头疼,成员变量.类变量.局部变量等等,今天就来分别认识认识他们吧! Java面向对象之各种变量详解 前言 在 Java语言中, 根据定义变量位置的不同,可以将变量分成两 ...

  2. java中hashCode()与equals()详解

    首先之所以会将hashCode()与equals()放到一起是因为它们具备一个相同的作用:用来比较某个东西.其中hashCode()主要是用在hash表中提高 查找效率,而equals()则相对而言使 ...

  3. Java面向对象的三大特征详解

    一.封装(Encapsulation)       封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保 ...

  4. Java面向对象中this关键字详解 意义+实例讲解【hot】

    this关键字 >>>便于理解简单的定义 this关键字可以简单的理解为,谁调用this所在的方法,this就是谁. 类的构造函数与getter.setter方法常用到this关键字 ...

  5. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  6. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  7. Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型

    Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...

  8. java.util.ResourceBundle国际化用法详解

    java.util.ResourceBundle国际化用法详解 初识国际化和ResourceBundle 这个类主要用来解决国际化和本地化问题.国际化和本地化可不是两个概念,两者都是一起出现的.可以说 ...

  9. Java之函数式接口@FunctionalInterface详解(附源码)

    Java之函数式接口@FunctionalInterface详解 函数式接口的定义 在java8中,满足下面任意一个条件的接口都是函数式接口: 1.被@FunctionalInterface注释的接口 ...

  10. JAVA反射概念及使用详解(超详细)

    JAVA反射概念及使用详解 一.什么是反射? 反射:框架设计的灵魂 框架:半成品软件.可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 ​ 好处: ​ ...

随机推荐

  1. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU外设那些事(2)- 善变的FlexRAM

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的FlexRAM外设. 本文是外设系列第二篇,上一篇讲的是离内核最近的高速缓存L1 Cache, ...

  2. IO流-文件操作

    一.字节流读/写 文件 1.字节流 方式读取文件

  3. HTML小技巧:按钮中的文字换行 .

    一般按钮的文字都是一行的.但是有的时候画面需要按钮中的文字换行. 刚开始有个开发人员说没法实现.\r\n 都用过了没有效果.其实google这个老师是非常强大的. 直接换行的方法:<input ...

  4. 虚幻UE4的后处理特效介绍 http://www.52vr.com/thread-31215-1-1.html

    转载 虚幻UE4提供了后处理特效的功能,可以实现景深,光溢出,色调调整,饱和度等等.要使用虚幻4的后处理,就一定要用到PostProcessVolumn,这是一种特殊的体积,可以放置在场景中的任何位置 ...

  5. could not insert: [com.trs.om.bean.UserLog] The user specified as a definer ('root'@'127.0.0.1') does not exist

    2019-07-01 11:24:09,315 [http-8080-24] org.hibernate.util.JDBCExceptionReporter logExceptionsWARN: S ...

  6. day39-Spring 02-AOP的概述

     横向抽取的机制其实就是代理机制.对UserDao生成一个代理类:UserDaoProxy.被代理对象和代理对象它俩实现相同的接口它俩肯定是平级的,这就是横向抽取的机制.如果这时候调用UserDao的 ...

  7. Python2 生成器 简介

    1. A generator: provide a kind of function that can return an intermediate result ("the next va ...

  8. LeedCode OJ -- String to Integer (atoi)

    点击打开题目链接 题目意思就是自己实现一个atoi函数,也就是将字符串转换成int型. 关于INT_MAX和INT_MIN, 只是在<limits.h>文件中定义的宏..分别是int型可以 ...

  9. Java转iOS-第一个项目总结(2):遇到问题和解决方案

    目录1.UITableView滑动卡顿的优化 2.右滑手势返回 3.添加页面统计 4.debug版和release版 5.关于页面刷新 6.关于页面布局 7.推荐博客 遇到问题和解决方案 本文是Jav ...

  10. phpexcel使用说明3

    下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...