"=="和equals方法的区别

在Java中,==用于比较基本数据类型和包装类型的引用是否指向同一内存地址,适用于基本数据类型和部分包装类型(除Float和Double)的比较。equals方法默认由==实现,但可以被重写以实现自定义的比较逻辑。Integer在[-128,127]范围内使用常量池,超出此范围则在堆中创建新对象。

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

1."=="

在java中,== 是直接比较两个对象的堆内存地址是否相等。 若相等,则代表两个引用指向同一个对象地址。

但我们分析下面这个情况:

例1:
		int a = 10;
		int b = 10;
			
		System.out.println(a == b);	

上面这个例子的结果为true。

那么,这是否意味着a和b指向同一个地址?

是的。

对于基本数据类型(byte,short,char,int,long,float,double,boolean),他们是作为常量在方法区中的常量池里以HashSet策略存储起来的。这就意味着无论我们定义int a=10,b=10还是c=10, abc中的引用都指向的同一个地址(存储int型数据10的地址)。因此,对于这些数据类型,我们就可以用==来比较他们是否相等。

另外,对于基本数据包装类型(Byte,Short,Character,Integer,Double,Float,Long,Boolean)除了Float和Double外,其他六种都是实现了常量池的。因此,对于这些数据类型,我们一般也可以用==来判断他们的大小。

但有一点需要特别注意:

例2:
		Integer a = 127;
		Integer b = 127;
			
		System.out.println(a == b);	
		
		Integer a = 128;
		Integer b = 128;
			
		System.out.println(a == b);	
		

这个例子的结果为true,false。

这是因为Integer常量池的存储范围为[-128,127]。若初始的值大于这个范围,
则会在堆中创建一个新的Integer对象来保存这个值,所以a,b指向了两个不同的对象地址,从而导致了不相等。

2.equals方法

以下为Object类中的equals方法
在这里插入图片描述显然Object类中的equals方法是直接由==来实现的。

众所周知,我们所有的类都直接或间接地继承自java.lang.Object类,因此我们可以通过重写equals方法来实现我们自己想要的比较方法。下面是eclipse为我们自动生成的equals方法 ↓

在这里插入图片描述

那为什么又要说==和equals方法的区别呢

原因是equals方法是可以由我们自己重写的。我们可以通过重写equals方法来实现我们自己想要的比较方法。

文章内容大部分为转述 在java中==和equals()的区别 这篇博客。

文中不当之处欢迎大佬们指教或提出异议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值