==和equals()的关系

来源:互联网 发布:优胜网络在线教育 编辑:程序博客网 时间:2024/06/07 11:18

在搞清楚==和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()方法,比较的是对象句柄。

原创粉丝点击