【Java】equals和==的区别和联系

本文详细解析了Java中==运算符与equals方法的区别及联系,重点介绍了它们在String、Integer和Date类中的表现差异,并总结了两者使用的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个是我总结的,一家之言,欢迎大家批评指正,欢迎留言 。

1.关于==

==是一个运算符,当两个对象用==连接的时候,返回一个布尔类型的值,要么是true,要么是false。它比较的是两个对象在内存中的地址,当一地址样的时候,那么我们就可以说这两个对象是==的。那么在什么情况下,两个对象在内存地址中的才是一样的呢?

其中一种情况是,创建了一个对象test1,然后将test1通过=运算符赋值给另一个对象test2,也就是如下所示:

Test test1=new Test("Java");
Test test2=test1;
System.out.println("测试1:"+(t2==t1));
上面这个代码打印的是

 测试1:true

2.equals方法

在Java中所有的类都默认继承自Object类,其他所有的类都是Object类的子类。在Object类中有一个equals方法。也就是说,对于其他所有的类,如果没有重写equals方法,默认继承Object中的equanls.

到Object类中查看equals方法时,发现:

public boolean equals(Object other)
{
    if(this.obj==other)
        return true;
    return false;
}

也就是说再没有重写过equals方法的类中,如果两个对象==,那么这两个对象equals;如果这两个对象equals,那么它们==。==是equals的充要条件。


3.在String、Integer和Date类中的区别

在上述这三个类中,都重写了equals方法。查看String源码可知,只要两个字符串长度相等并且每个字符都相同,那么这两个对象equals。

对于下列代码:

<pre name="code" class="java">String a1="abc";
String b1="abc";
System.out.println("测试点2:"+(a1==b1)“ ”+b1.equals(a1));

String b2=new String("abc");
System.out.println("测试点3:"+(a1==b2)“ ”+b2.equals(a1));

打印的是:

<pre name="code" class="java"> 测试2:true true
 测试3:false true

三者彼此equals,大家应该很好理解,根据String类中的equals方法。而为什么a1==b1成立,但是a1==b2却返回false呢?这是因为String a1="abc";执行的是将abc字符串在内存中的地址放到a1区域;String b1="abc";执行的也是将abc字符串在内存中的地址放到b1区域,相当于下面的代码的功能:

String a="abc";
String a1=a;
String b1=a;
所以,a1==b1成立。

而String b2=new String("abc");相当于又创建了一个"abc"的字符串对象,字符串在内存中地址放在了b2区域。所以a1和b2区域存放的是不同的对象的地址。

也就是说,两个对象如果==成立,那么它们equals时一定也成立;而如果两个对象equals成立,但是不一定==成立。==是equals的充分不必要条件。


4.总结

经过上面两个类型的分析,结论是:==要求两个对象的条件更苛刻,两个对象的区域内存放的地址值一定要相同。而equals在原则上则有了一些舍弃。














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值