equals方法与==到底有什么区别

本文详细解析了Java中==与equals的区别,包括它们在不同情况下的行为表现,特别是对于字符串和包装类的处理方式,并提供了示例代码帮助理解。

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

==:是一个比较运算符,用来判断两个变量是否相等即两个对象在内存中的首地址是否相同。

equals ():是Object类提供的一个实例方法也就是说每个类都含有这个方法,如果不对其重写。它的作用是和==是一样的

如果不对其重写。

下面看个例子

package com.iss.test;


public class Test {

public static void main(String[] args) {

String s1, s2, s3 = "abc", s4 = "abc";

s1 = new String("abc");
s2 = new String("abc");

System.out.println(s3 == s4);// 结果为true这是因为在字符串池中如果已经有相同的字符串,就会将值直接赋给引用,因此它们指向的同一个对象
System.out.println(s1 == s2);// 結果为false这是因为它们的内存地址不一样,指向的对象不一样
System.out.println(s1.equals(s2));// 结果为true。为什么呢不是说它和==的作用是一样的吗?原因在于它把从Object继承而来的equals方法重写只要保证内容相同就返回true

// 但是在Stringbuilder中就没有对equals()进行重写所以结果为false;
StringBuilder builder = new StringBuilder("abc");
StringBuilder builder2 = new StringBuilder("abc");

System.out.println(builder.equals(builder2));

// 变为String类型就会相等了可见String对equals()进行了重写
System.out.println(builder.toString().equals(builder2.toString()));

}
}


Object 中默认的equals()和==是等价的只是比较内存的中的地址,我们可以通过重写equals()来自定义自己的等价规则

ps:对基本类型的比较只能是通过==进行比较因为他们没有equals()这个方法只要数值相同,可以不问他们的数据类型。这是因为java的自动数据类型提升。

int a = 10;
float b = 10.0f;
double c = 10.0000;

System.out.println(a==b);//true
System.out.println(a==c);//true


8个基本类型所对应的包装类型的equals()方法也被重写成只比较内容。


Integer num1=new Integer(12);
Integer num2=new Integer(12);

System.out.println(num1==num2);//false
System.out.println(num1.equals(num2));//true


总结:两者区别就在于equals()方法有没有被重写。



   ==equals方法究竟有什么区别?   == 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。   如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。   equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:     String a=new String("foo");     String b=new String("foo");   两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即ab中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值