JAVA中的equals和==
首先我们 先看一下运行的代码,如图:
可以看到输出结果为 true false true
那么问题来了!
一、首先第一个问题,a==b 运行结果是true ,而str1 == str 2 运行结果是false呢???
首先我们要明白基本数据类型变量和非基本数据类型变量的区别(也叫引用数据类型)。
1、基本数据类型:
byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0
short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0
int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0
long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L
float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0
char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空
boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false
2、引用数据类型:
类、接口类型、数组类型、枚举类型、注解类型。
区别:
基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上。
引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。
那么再次回到我们刚才的问题
a == b
经过上面的分析我们知道了对8种基本数据类型,变量值存的是值,而用 == 比较的时候,比较的是值本身,a存的是1 , b存的是1 ,所以用 == 比较的结果是true。
str1 == str2
str1是引用数据类型,所以存的不是值而是对象中的地址,所以用 == 比较的时候它们分别指向不同的对象,也就是说它们实际存储的内存地址不同。所以返回的当然是false了。
二、那么第二个问题来了str1.equals(str2)为什么是true呢???
equals方法是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法。为了更直观地理解equals方法的作用,直接看Object类中equals方法的源码。
很显然,在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。
但是有人又会有疑问了,为什么下面一段代码的输出结果是true?
那是因为String重写了equals方法,下面是String 重写equals方法
可以看出,String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。
其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。
总结来说:
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
可能有些小白会有疑问 为什么int不能用equals呢??
答:
int是基本类型,不是对象,没有方法;
string是对象
通俗简单来说就是 男人能生小孩吗???