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是对象

通俗简单来说就是 男人能生小孩吗???

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值