由一个比较运算想到的

前几个,一个朋友和我说

java 这个问题要小心:

我一看也蒙了,怎么会这样呢,确实超出我的理解(我对java语言并不熟悉)。

 随后,我问他这个结论的出处在哪里,他发给我一个链接:为什么Java中“1000==1000”为false,而”100==100“为true? - YSOcean - 博客园 (cnblogs.com)

文章的标题是在是太惊人了,比朋友发给我的那段还惊人,那段里面好歹说的是两个变量的比较。这个标题直接变成了 “Java中“1000==1000”为false”,这个1000==1000,可是两个常量的比较啊,整型常量的比较也能出现问题?我下意识觉得这是不可能的。

充满好奇地认真看了一下文章内容。发现作者还是蛮认真的,也很有钻研精神,又是看编译的class文件,又是翻java类库的源代码,然后还列举了阿里的开发手册。

最后所有内容加起来,确实也把问题说明白了,但是我总是觉得个文章怪怪的。仔细分析了一下,主要原因在于:

首先,标题党。这个标题就由非常大的标题党的嫌疑。我们知道最后是对 a,b,这两个 integer类型的变量进行比较,才出现了一些变化,并不是争对 “1000 == 1000” 这两个常量的比较本身有不确定的结果,对变量和常量的操作,本身就非常的不同,这个我作为一个学C++出身的程序员是清晰理解的。

第二,本质原因不够明确。原因有说,但是不够明确,本质上就是在java中,“==”这个比较运算符,争对基本数据类型和引用类型的效果是不一样的,争对基本数据类型,它比较的是两个数据的值。但是争对引用类型,他比较的其实是两个对象是否是同一个对象。如果把这个结果类比为C++的概念,这里的引用数据类型其实就相当于是指针变量,等于比较运算符比较的是指针变量所指向的地址是否相同。这样就很容易理解,很容易得出正确的结论。(我自己最初蒙的原因在于对java的不熟悉,粗粗一看代码,以为 Integer也是java的一种基本的整数类型,没有意识到它其实不是基本数据类型,而是一个整数的包装类,包装类也是类,那它的实例变量就是一个对象,那就要遵循对象的基本原则,是引用类型。)如果清晰地理解了这一点,就不要去疑惑,为啥a==b会是false,也不用去翻代码论证这个事情了,这是非常合理的一个结论。当然,就更不需要拿出阿里的开发手册来补充说明。

第三,我觉得应该讨论的反而是为啥单 a,b等于100的时候,a==b是true,当然这个文章里面说了原因。我这里想说的是,这样的一种逻辑,从原理的理解上,才是更加正确,更加接近真相的,而不是反过来。

最后,我一开始稍微有一点疑惑的是,阿里的开发手册,为什么专门加了这么一条

被这位作者拿来佐证这个 a==b结果是false是一个奇怪的事情呢?难道是ali也有很多同学没能正确理解Integer 是一个类,它的对象不应该直接用 == 来比较这么一个基本常识么?后来仔细思考后,认为两种可能吧:

1,真的有人并不理解前面说的第二条。

2,只是为了整个手册的严谨性,事无巨细都加上。

我更倾向于是第二种吧,以前看C++的各种规范的时候,也是常见会把一些非常基本的内容都加上。 

随着互联网越来越便利,网络上的资料、讯息也越来越丰富。这极大地方便了大学学习知识,查阅资料。

但是同时,也引发了一个问题,网上的大量信息真假难分。资料好坏混杂,不容易识别。所以我们大家一定需要有牢固的基础知识,再加上看资料的时候,多加上自己的思考,取其精华去其糟粕,以尽量减少被误导,多吸收有用的知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值