==和equals()的关系

在搞清楚==和equals()关系之前,要先厘清基本类型、String、以及实例对象在内存中的分配机制。
这里写图片描述

不同对象在内存

1.基本类型(byte、short、int、long、float、double、char、boolean):以int为例
1. int a = 12:会先查询栈中是否存在12,如果没有,会先创建,然后将a指向它;如果有的话,会直接指向它;如果修改a的值的话,如a = 13;道理相同;
2. int b = 12:会先查询栈中是否存在12,如果没有,会先创建,然后将b指向它;如果有的话,会直接指向它;如果修改b的值的话,如b = 13,道理相同;

所以a和b指向的是栈中的同一块内存。

2.new对象实例
1. Test testA = new Test();会在栈中创建引用变量testA,然后在堆中创建对应的内存块
2. Test testB = new Test();会在栈中创建引用变量testB,然后在堆中创建相应的内存块

3.String
String在内存中的分配方式有两种:
1. String c = “hello”与String d = “hello”的分配机制与基本类型相同
2. String c = new String(“hello”)与String d = new String(“hello”)的分配机制与new 实例内存分配机制相同

== 和equals()比较

==比较的是对象句柄
1. 对于基本类型来说,如果两个变量指向同一个值,句柄相同;而且基本类型的比较只能用==,没有equals()方法;
2. 对于String来说,如果两个变量指向同一个值(即通过String a = “”而非new String(“”)赋值),句柄相同;
3. 对于new对象实例来说,指向的是堆中的不同内存块,所以句柄不同

equals对于不同类型,含义不同
1. 对于String来说,重写了equals()方法,比较的是String的内容;
2. 对于new实例对象来说(包括以new String()方式创建的String对象),使用的都是Object的equals()方法,比较的是对象句柄。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值