【Java】浅谈“equals“和“==”

简介: 【Java】浅谈“equals“和“==”

【Java】浅谈“equals“和“==”

在java中,equals方法和==都是用来作比较的,可是你知道它们之间有什么区别和联系吗?

       首先,透露一点,在所有类的父类Object中,equals在本质上和==都是一样的,如果查看源码,你会发现这里面equals方法的内部实现就是==;

image.png

       如果是比较两个Object对象的大小,直接用==就可以了。


“==”


1、判断比较的两个对象是否是同一个对象,内存地址是否相同;

2、比较的两个对象必须是同一类型的数据,或者是子类和父类之间的比较。否则编译不通过;

3、如果是数字之间的比较,比较的是数值是否相等,直接使用“==”。

equals()方法


1、一般情况下,我们使用equals来比较的是两个对象的内容是否相等;

2、由于所有的类都是Object类的子类,如果一个类没有对该方法进行重写的话,在调用该方法时会调用Object类中的equals()方法。

       介绍一个比较特殊的类——String首先,我们都知道,当我们用new去创建一个新对象的时候,会在堆中开辟出一个新的地址,所以用==比较两个相同值的对象时,会返回false。但是在String重写了Object类的equals方法。

image.png

       当创建两个相同值的String对象时,调用equals方法比较的是String对象的值,所以返回true。

       但是String类也比较特殊,它可以直接通过赋值产生一个对象,例如:String s1 = “abc”;String s2=“abc”;在用“==”比较两个String对象的时候,如果String对象都是直接赋值产生的,结果会返回true。猜一猜这是为什么?

       String是引用类型,所以s1和s2中只是存放了地址,而它的值不是new出来的,在编译阶段就可以确定下来,所以这个值被系统存放在常量池中,而不是在存放在堆中,这时候再创建一个s2=“abc”,因为同样是要放在常量池中,创建时发现常量池中已经存在同样的数据,直接把s2指向了常量池中的“abc”,所以s1和s2指向同一块地址。Are you OK?



示例代码如下所示:

image.png

       话说s1和s4不应该指向同一块地址吗?为什么会返回false呢?

注意一下


1、如果是我们自己写的类,要按照属性比较两个对象是否相等时,需要重写equals方法,否则会直接调用Object的方法,判断两个对象的地址是否相等。另外重写equals方法时,需要重写hashcode方法,以后再讲具体原因。

2、"=="比"equals"的运行速度快,因为"=="只是比较引用的地址。

目录
相关文章
|
3月前
|
Java
Java中的equals()与==的区别与用法
【7月更文挑战第28天】
58 12
|
3天前
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
13 3
java中“==”和equals,究竟比的是什么
|
2月前
|
Java
【Java基础面试二十三】、==和equals()有什么区别?
这篇文章区分了Java中的`==`运算符和`equals()`方法:`==`用于基本数据类型时比较值是否相等,用于引用类型时比较内存地址是否相同;而`equals()`默认实现按内存地址比较,但通常被重写以根据对象内容比较是否相等。
【Java基础面试二十三】、==和equals()有什么区别?
|
2月前
|
Java
【Java基础面试二十一】、说一说hashCode()和equals()的关系
这篇文章讨论了Java中`hashCode()`和`equals()`方法之间的关系,强调如果两个对象相等,它们必须有相同的哈希码,但有相同哈希码的对象未必相等,并解释了这一关系在HashSet集合中判断元素是否重复的应用场景。
【Java基础面试二十一】、说一说hashCode()和equals()的关系
|
2月前
|
存储 Java
|
2月前
|
Java
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
这篇文章解释了为什么需要重写`hashCode()`和`equals()`方法:因为Object类的`equals()`默认使用`==`比较,这在业务中通常是不够的,我们需要根据对象内容来比较相等性;同时,为了保持`hashCode()`与`equals()`的联动关系,一旦重写了`equals()`,通常也需要重写`hashCode()`。
【Java基础面试二十二】、为什么要重写hashCode()和equals()?
|
3月前
|
存储 Java 索引
java 中为什么重写 equals 后需要重写 hashCode
java 中为什么重写 equals 后需要重写 hashCode
57 8
|
2月前
|
存储 Java 索引
|
5月前
|
Java
java equals和==
==是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用两个方法 public boolean equals(0bjectobj):参数可以是任何对象,只有参数是一个字符串并且内 容相同的才会给true;否则返回false 注意事项: 1.任何对象都能用object进行接收。 2.equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样。 3.如果比较双方一个常量一个变量,推荐把常量字符串写在前面。 推荐:"abc".equals(str) 不推荐:str.equals("abc") public boolean egualsIgnoreCas
31 0
|
3月前
|
Java
Java中的Object类 ( 详解toString方法 | equals方法 )
Java中的Object类 ( 详解toString方法 | equals方法 )
下一篇
无影云桌面