版权声明:本文为博主原创文章,同步今日头条号:Java云笔记。转载请附上博文链接: https://blog.csdn.net/weixin_44259720/article/details/88236466
(" ^_^ " 看总结请直接拉到最下面 " ^_^ ")
通常,判断两个变量是否相等有两种方式:"==" 和 equals() 方法
分析:
要想明白二者的不同,我们先要明确一个概念:
Object 类是所有 Java 类的父类,所有的 Java 类都要继承 Object 类,通常不显式声明继承的类,都默认继承自 Object 类。
equals() 是属于 Object 类的方法,name我们来看一下源码吧:
诶,惊不惊喜,原来 Object 类中的 equals() 方法里封装的是运算符 "==",也就是说,最初两种方法的作用是一样的,都是用来比较地址的,那为什么在实际生产中比较的结果可能会是不一样的呢?
原来,Java 中很多类重写了 Object 类中的 equals() 方法(如:String,Integer,Data ...),让它有了新的含义,也就造成了与 "==" 使用上的差异,我们以常用的 String 类为例,看看它的 equals() 方法源码:
上面的代码可以这样理解:
- 如果两个字符串 "==" 结果相等,就是说地址一样,那么虚拟机就认为是一个对象,字面量自然是相等的;
- 如果两个字符串 "==" 结果不相等,再逐一对比每个字符,判断字面量是否相同,如果相同认为是相等的;
有一点需要注意:
- 对于自己定义的类,如果需要进行比较操作,就需要自己重写 equals() 方法,否则对比的就不是字面量了;
- 重写 equals() 方法之后必须重写 hashCode() 方法,二者是绑定在一起的;(不知道原因的可以关注我的相关微博)
总结:
1. 对于 "==" :
- 如果作用于 "基本数据类型" 的变量,则直接比较其存储的 “值”;
- 如果作用于 "引用类型" 的变量,则比较的是所指向的对象的地址。
2. 对于 equals() 方法:
(注意:equals() 方法不能作用于基本类型的变量,但基本类型对应的包装类是可以的)
- 如果没有对 equals() 方法进行重写,比较的是引用类型的变量所指向的对象的地址;
- 如果对 equals() 方法进行了重写,则比较的是所指向的对象的内容(如:String、Date类等)。
面试题:
1. 请解释下字符串比较之中 “==” 和 equals() 的区别?
- ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
- equals():比较的是两个字符串的内容,属于内容比较。
2. 持续更新,敬请关注...
更多精彩,请关注我的"今日头条号":Java云笔记
随时随地,让你拥有最新,最便捷的掌上云服务