碰到“equals”和“==”这两个字符,老感觉差不多;其实还是有一些区别的,今天小编带大家一探究竟!
01、==介绍
它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。
-
基本数据类型:byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
-
引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。
举个例子
1 |
|
输入结果:
疑问点:为什么j和jj的地址是一样的,k与kk的地址却不一样呢?
答案:在-128~127的Integer值并且以Integer x = value;的方式赋值的参数,x会从包装类型自动拆箱成基本数据类型,以供重用!所以,j、jj的内存地址都是一样的!
下面我们把100变成1000试试!
1 |
|
输入结果:
当j、jj超出-128~127区间的时候,地址就变了,所以比较的结果就是false。
再看其它的包装器自动拆箱情况:
|类型|描述| |:–:|:–:| |Boolean |全部自动拆箱| |Byte |全部自动拆箱| |Short|-128~127区间自动拆箱| |Integer|-128~127区间自动拆箱| |Long |-128~127区间自动拆箱| |Float |没有拆箱| |Doulbe |没有拆箱| |Character |0~127区间自动拆箱|
02、equals()方法介绍
它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
- 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
- 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
Boolean、Byte、Short、Integer、Long、Float、Doulbe、Character 8种基本类型的包装类都重写了 equals() 方法,所以比较的时候,如果内容相同,则返回 true,例如:
1 |
|
03、String类型的比较介绍
string是一个非常特殊的数据类型,它可以通过String x = value;的方式进行赋值,也可以通过String x = new String(value)方式进行赋值。
String x = value;方式赋予的参数,会放入常量池内存块区域中; String x = new String(value)方式赋予的参数,会放入堆内存区域中,当成对象处理。 举个例子:
1 |
|
输入结果:
为什么string的equals()方法比较返回true,因为string重写了equals()方法,源码如下:
1 |
|
如果内容相同,则返回true!
总结:如果需要比较某个对象是否相同,一定要重写equals(),比较其中的内容是否相同,如果相同,返回true;否则,返回false!