Java中equals方法和==的区别分析

equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false。equals方法和“==”的区别面试中的常见问题,网上有海量稀奇古怪的解释,个人认为直接了解它需要知道它的源码,首先是Object类的equals方法:

public boolean equals(Object obj){return (this == obj);
}

看完源码,发现Object层面上好像两者就是一个东西,但大家不要忘了子类是可以重写父类方法的,在String、Integer等常用类中都对这个方法进行了重写,String类中equals()方法的源码如下:

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;}

Integer类中equals()方法的源码如下:

    public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}

其他几个包装类也类似,根据源码可以看到各个子类在父类equals方法的基础上加上了进一步判断,使得在特殊情况euqals方法可以按照值进行比较。
现在我们对二者区别做个总结:
1.针对基本的8种基本类型变量,二者是同一个效果,比较值是否相同。
2.针对一般的引用类型变量(一般的类),二者也是同一个效果,比较两个类的存储地址是否相同(是不是一个类)。
3.争对String、Integer等的封装类型,二者效果不同,==要求两边是一个对象,而equals方法只要两边值相同就可以。
我们以String类举例:

public static void main(String[] args) {String a = "apple"; //String类对象String b = a; //b和a指向同一对象String c = "apple"; //c是另一个String类对象,但和a的值相同System.out.println(a == b); //true System.out.println(a.equals(b)); //true System.out.println(a == c); //falseSystem.out.println(a.equals(c)); //trueSystem.out.println(b == c); //falseSystem.out.println(b.equals(c)); //true
}

补充,对于equals方法判断为true的两个对象,他们的hashcode一定相等(比如对于String类,相同的字符串调用hashCode()方法,得到的值是一样的,与内存地址、进程、机器无关),换句话说,如果你要重写对象的equals方法,那么它的hashCode方法也必须一起被重写。

//String类的hashCode方法
public int hashCode() {int h = hash; // 默认值是0if (h == 0 && value.length > 0) {char val[] = value; // 字符串对应的char数组for (int i = 0; i < value.length; i++) {h = 31 * h + val[i]; // val[0]*31^(n-1) + val[1]*31^(n-2) + ... + val[n-1]}hash = h;}return h;
}

Java中equals()方法和==的区别分析相关推荐

  1. Java中equals方法和==有什么区别

    我们先上结论喽: ==要求比较严格,要求两个对象必须是同一个对象: equals方法,判断完了是否是同一个对象,会继续判断两个对象的值是否相同,他的要求没那么严格,只要值相同,就好了. 文章目录 1. ...

  2. java中equals方法的用法以及==的用法(转)

    2019独角兽企业重金招聘Python工程师标准>>> equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用" ...

  3. Java中Comparable和Comparator接口区别分析

    本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...

  4. java中equals方法重写详解(彻底搞定)

    首先上案例: public static void main(String[] args){String str1 = "abc";String str2 = "abc& ...

  5. Java中equals方法造成空指针异常的原因及解决方案

    前言 博主最近在做一个项目的调试工作,期间遇到了一个会导致抛出空指针异常的小问题,说它是小问题,是因为真的只是在写代码的时候注意一下就好了,但是这里还要写一个博客,就是为了剖析这个问题,然后给自己做个 ...

  6. Java中equals()方法重写

    Java中的equals()方法是在Object类中定义,Object类是所有类的父类.换句话说,任何类都隐含地继承了该方法.判断两个对象的内容是否相同,必须使用equals()方法,对于没有重写该方 ...

  7. java中equals方法的参数_equals方法的参数必须为Object类型的引用变量

    核心结论:子类重写Object类的equals方法需要注意的事项 重写的时候一定要注意equals方法的参数是Object obj类型的引用变量.绝对不可以是其他类型的变量.因为这样的话,和父类Obj ...

  8. Java中equals和等号的区别,觉着不错

    转自:http://www.javaresearch.org/html/article/46110.htm 一句话概括:==比较的是两个对象的引用(即内存地址)是否相等,而equals()比较的是两个 ...

  9. JAVA中equals()方法的重要性

    对于对象比较使用equals()方法的重要性,这里以String类为例进行了比较. /*** 对于对象比较使用equals()方法的重要性,这里以String类为例进行了比较.* @author HA ...

最新文章

  1. oracle 安装grid补丁,安装oracle 11.2.0.4.4的psu补丁过程
  2. OVS vswitchd启动(三十九)
  3. #error使用分析
  4. C++ 并发编程(四):基于 Asio 的线程池
  5. c语言 ipc 参数 序列化,浅谈IPC通信之序列化与反序列化(三)
  6. dubbo 自定义路由_爱奇艺在 Dubbo 生态下的微服务架构实践
  7. 索尼音乐牵手UNLEASH厂牌 实力新星LiCong李聪 Veegee正式加盟
  8. Java 在命令行编译Java源码
  9. Axure RP Extension for Chrome最新版查看RP原型
  10. PS 考试案例 01笔记
  11. 3个国内最大的黑客学习网站
  12. 手机不能连接本地服务器进行调试的解决办法(Localhost:8080)
  13. 地铁7号线路图_成都地铁7号线线路图_运营时间票价站点_查询下载
  14. 告别户外弱网困扰,4G多卡聚合设备增强弱网环境下应急救援信号
  15. 成功解决numpy.ndarray size changed
  16. 香港城市大学全球首创3D打印微型机器人技术 有望作治疗癌症用途
  17. C++应用之自定义大整数类
  18. 选择代码覆盖工具的 10 个标准
  19. Python Statsmodels 统计包之 OLS 回归
  20. Windows管理员必须掌握的25个PowerShell命令​

热门文章

  1. csv导入mysql php实现_PHP实现csv文件导入mysql数据库的方法
  2. mysql主从有关参数_mysql主从复制配置
  3. 农艺师需要职称计算机,评农艺师需要发表几篇论文?
  4. html边框塌陷怎么,你不知道的CSS(边框塌陷)?
  5. Go语言基础练习题系列2
  6. Sqlit--学习教程(基本操作1)
  7. 关于电商网站购物车功能如何与登录账号相关联的一点想法
  8. Python 第三方扩展库
  9. Linux 安装 MySQL 数据库
  10. (74)FPGA模块调用(VHDL调用VHDL)