首页 > 编程知识 正文

integer类型怎么比较,integer数据范围

时间:2023-05-06 17:25:46 阅读:282830 作者:4022

java基本类型的常见问题及看法

基本类型数据比较的常见问题

想当年刚开始做项目的时候,遇到了一个及其坑爹的问题。
如下所示:

Integer countOfGoods = 289;Intger realCount = 289;if(countOfGoods==realCount ){ #具体的业务代码 balabala}else{ throw new BizException("数量错误!");}

想必各位看官都知道我要说啥了,在编译通过之后,运行的时候居然抛出了我自己定义的业务异常。作为刚毕业的菜鸟的我简直被Σ(っ °Д °;)っ的手足无措。为啥这两个数值不相等,明明都是289。

==和equals的区别

要想知道为什么明明都是289的包装类的两个对象用==去做比较的时候为啥不相等,首先我们得知道==怎么去比较的。

==

首先java的数据类型分为基本类型和对象类型,那么用==去比较两个基本类型的时候是直接比较数值的。
a. 基本数据类型

int i = 1;int x = 1;#truei==x;

b. 包装类型(对象)
这种情况就是我开头提到的两个包装类型对象不相等,因为==比较的是两个对象的引用地址(java对象都是存放在堆,对象应用存放在栈)。很显然countOfGoods 和realCount 是不同的对象,那么比较的结果就是false

equals

a.基本数据类型
这个方法的初始行为是比较对象的内存地址,但在一些类库中,这个方法被覆盖掉了,如String,Integer,Date等。在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

int i = 129;int x = 129;#truei.equals(x);

b.复合数据类型
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,它们之间的比较还是基于他们在内存中的存放位置的地址值的

Integer i = 129;Integer x = 129;#falsei.equals(x); Integer.valueOf()缓存

到目前为止一切都很顺利,至少看起来很合理,但是突然有一天小明跑来问我,哥 你这儿好像有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(),废话不多说 直接看源码。

/** * Returns an {@code Integer} instance representing the specified * {@code int} value. If a new {@code Integer} instance is not * required, this method should generally be used in preference to * the constructor {@link #Integer(int)}, as this method is likely * to yield significantly better space and time performance by * caching frequently requested values. * * This method will always cache values in the range -128 to 127, * inclusive, and may cache other values outside of this range. * * @param i an {@code int} value. * @return an {@code Integer} instance representing {@code i}. * @since 1.5 */ public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }

因此上述的这种情况,就是因为Integer直接去拿到缓存的对象返回给我们了。所以两个对象引用其实是指向同一个对象的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。