java基本类型的常见问题及看法
基本类型数据比较的常见问题想当年刚开始做项目的时候,遇到了一个及其坑爹的问题。
如下所示:
想必各位看官都知道我要说啥了,在编译通过之后,运行的时候居然抛出了我自己定义的业务异常。作为刚毕业的菜鸟的我简直被Σ(っ °Д °;)っ的手足无措。为啥这两个数值不相等,明明都是289。
==和equals的区别要想知道为什么明明都是289的包装类的两个对象用==去做比较的时候为啥不相等,首先我们得知道==怎么去比较的。
==
首先java的数据类型分为基本类型和对象类型,那么用==去比较两个基本类型的时候是直接比较数值的。
a. 基本数据类型
b. 包装类型(对象)
这种情况就是我开头提到的两个包装类型对象不相等,因为==比较的是两个对象的引用地址(java对象都是存放在堆,对象应用存放在栈)。很显然countOfGoods 和realCount 是不同的对象,那么比较的结果就是false。
equals
a.基本数据类型
这个方法的初始行为是比较对象的内存地址,但在一些类库中,这个方法被覆盖掉了,如String,Integer,Date等。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
b.复合数据类型
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,它们之间的比较还是基于他们在内存中的存放位置的地址值的
到目前为止一切都很顺利,至少看起来很合理,但是突然有一天小明跑来问我,哥 你这儿好像有bug啊?我第一反应就是 dog Lee有 我都不可能有,哈哈哈。但是出于负责认真的态度,我还是仔细的看看。
#正常情况 金额需要使用bigDemical或者是long类型标识 Integer takeMoney = new Integer(1);Integer fetchMoney = new Integer(1);#trueif(takeMoeny==fetchMoeny){#业务代码}按照我们上述的分析来讲的话,这个地方两个不同对象引用地址应该是不同的,所以应该是false,但是结果却是true。
因为当我们在对基本数据类型进行装箱的时候,jdk会判断我们需要装箱的数值是否是在-128~127之间。假如是在这个区间的值,那么便会直接在内存中取到,也就是Integer.valueOf(),废话不多说 直接看源码。
因此上述的这种情况,就是因为Integer直接去拿到缓存的对象返回给我们了。所以两个对象引用其实是指向同一个对象的。