前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实践是检验真理的唯一标准

实践是检验真理的唯一标准

作者头像
wangning
发布2022-06-13 16:47:30
1890
发布2022-06-13 16:47:30
举报
文章被收录于专栏:小白慢跑

关于java中的”==”和equals 大家都知道:

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址 2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址(String,Date,Integer等一般都重写了)

这段代码大家可以看一下,以下代码都是基于java写的:

public static void main(String[] args) {

Integer a = 100;

Integer b = 100;

System.out.println("1 a==b " + (a == b));

System.out.println("2 a==b " + (a.equals(b)));

Integer a1 = 321;

Integer b1 = 321;

System.out.println("3 a1==b1 " + (a1 == b1));

System.out.println("4 a1==b1 " + (a1.equals(b1)));

}

大家思考一下输出结果是什么,结果为什么会是这样?Integer a = 100;这种写法本身包含了一个什么玄机?

好了公布一下答案:

1 a==b true

2 a==b true

3 a1==b1 false

4 a1==b1 true

是不是和您认为的有出入呢?为什么第一个是true,而第三个是false呢?根据本人目前的了解java还不能获取对象的内存地址(不借助第三方工具),有的同学说用hashcode,首先hashcode只是对象的一个标识和地址是无关的 其次equals被重写了,hashcode这个时候也是一样的。

看着很诡异是不是,我们借助工具可以看到反编译后的代码是这个样子的

public static void main(String[] args)

{

Integer a = Integer.valueOf(100);

Integer b = Integer.valueOf(100);

System.out.println("1 a==b\t" + (a == b));

System.out.println("2 a==b\t" + a.equals(b));

Integer a1 = Integer.valueOf(321);

Integer b1 = Integer.valueOf(321);

System.out.println("3 a1==b1\t" + (a1 == b1));

System.out.println("4 a1==b1\t" + a1.equals(b1));

}

哦,这个地方java帮我们自动做了一个类型转换从int,通过Integer.valueOf转换成了Integer,但是这又怎么样呢?确实这个地方看不出什么蹊跷,我们看一下Integer的代码:

public static Integer valueOf(int paramInt)

{

if ((paramInt >= -128) && (paramInt <= IntegerCache.high)) {

return IntegerCache.cache[(paramInt + 128)];

}

return new Integer(paramInt);

}

我去,它居然搞了一个从-128到128之间的一个缓存,难怪通过Integer.valueOf 转换的在这个范围内的对象==返回true呢。

都看到这里了,思考一个小问题如果是这样,结果会是什么呢?当然也有同学会说这个东西我一开始就知道答案,嗯,没错,这个要么说明您很犀利,要么说明您踩过这个坑,哈哈。

Integer a2 = new Integer(100);

Integer b2 =new Integer(100);

System.out.println("1 a2==b2 " + (a2 == b2));

System.out.println("2 a2==b2 " + (a.equals(b2)));

最后:语法糖虽然很甜,但是有时候也有看看背后发生了什么?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白慢跑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档