浅谈 Java 字符串比较中 == 和 equals() 的区别(带源码分析)

版权声明:本文为博主原创文章,同步今日头条号:Java云笔记。转载请附上博文链接: https://blog.csdn.net/weixin_44259720/article/details/88236466

(" ^_^ " 看总结请直接拉到最下面 " ^_^ ")

通常,判断两个变量是否相等有两种方式:"==" 和 equals() 方法

分析:

要想明白二者的不同,我们先要明确一个概念:

Object 类是所有 Java 类的父类,所有的 Java 类都要继承 Object 类,通常不显式声明继承的类,都默认继承自 Object 类。

equals() 是属于 Object 类的方法,name我们来看一下源码吧:

Object 类的 equals() 方法

诶,惊不惊喜,原来 Object 类中的 equals() 方法里封装的是运算符 "==",也就是说,最初两种方法的作用是一样的,都是用来比较地址的,那为什么在实际生产中比较的结果可能会是不一样的呢?

原来,Java 中很多类重写了 Object 类中的 equals() 方法(如:String,Integer,Data ...),让它有了新的含义,也就造成了与 "==" 使用上的差异,我们以常用的 String 类为例,看看它的 equals() 方法源码:

String 类重写的 equals() 方法

上面的代码可以这样理解:

  • 如果两个字符串  "=="  结果相等,就是说地址一样,那么虚拟机就认为是一个对象,字面量自然是相等的;
  • 如果两个字符串  "=="  结果不相等,再逐一对比每个字符,判断字面量是否相同,如果相同认为是相等的;

有一点需要注意:

  • 对于自己定义的类,如果需要进行比较操作,就需要自己重写 equals() 方法,否则对比的就不是字面量了;
  • 重写 equals() 方法之后必须重写 hashCode() 方法,二者是绑定在一起的;(不知道原因的可以关注我的相关微博)

总结:

1. 对于  "=="  :

  • 如果作用于 "基本数据类型" 的变量,则直接比较其存储的 “值”;
  • 如果作用于 "引用类型" 的变量,则比较的是所指向的对象的地址。

2. 对于 equals() 方法:

(注意:equals() 方法不能作用于基本类型的变量,但基本类型对应的包装类是可以的)

  • 如果没有对 equals() 方法进行重写,比较的是引用类型的变量所指向的对象的地址;
  • 如果对 equals() 方法进行了重写,则比较的是所指向的对象的内容(如:String、Date类等)。

面试题:

1. 请解释下字符串比较之中 “==” 和 equals() 的区别?

  • ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
  •  equals():比较的是两个字符串的内容,属于内容比较。

2. 持续更新,敬请关注...

更多精彩,请关注我的"今日头条号":Java云笔记
随时随地,让你拥有最新,最便捷的掌上云服务

猜你喜欢

转载自blog.csdn.net/weixin_44259720/article/details/88236466