Java Integer比较中的那些坑
2017-02-24 16:28
162 查看
前几天同事偶然遇到的一个问题,在list中查询出重复的值,留下第一个,其余删除。
然后喜闻乐见的程序出问题了:程序无法将相同的值除第一个外删除掉。说起来这也是一个比较基础性的问题。
int为基本类型,Integer类型为基本包装类型。因而可以将Integer当做一个对象来理解,所以在上面的代码示例中,用==来比较2个对象的引用无疑就是在搞笑了,地址都不一样,怎么可能返回true。
但是这里存在着一些坑,就是Integer有时候用==比较是可以得到true的(值相同),原因如下:
在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象。
所以推荐都使用equals比较。
附上int类型自动装箱为Integer时的源代码(IntegerCache.low为-128)
这里还牵涉到了一点,就是这里为什么不直接用int类型呢?这是因为ArrayList中只接受Object对象,实际情况如下:
ArrayList<Integer> a//a中装有要操作的数据,都是数字 for(int i;i<a.size();i++){ //....遍历 for(int j=i;j<a.size();j++){ if(a.get(i)==a.get(j)){ a.remove(j); } } }
然后喜闻乐见的程序出问题了:程序无法将相同的值除第一个外删除掉。说起来这也是一个比较基础性的问题。
int为基本类型,Integer类型为基本包装类型。因而可以将Integer当做一个对象来理解,所以在上面的代码示例中,用==来比较2个对象的引用无疑就是在搞笑了,地址都不一样,怎么可能返回true。
但是这里存在着一些坑,就是Integer有时候用==比较是可以得到true的(值相同),原因如下:
在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象。
所以推荐都使用equals比较。
附上int类型自动装箱为Integer时的源代码(IntegerCache.low为-128)
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
这里还牵涉到了一点,就是这里为什么不直接用int类型呢?这是因为ArrayList中只接受Object对象,实际情况如下:
ArrayList al=new ArrayList(); int n=40; Integer nI=new Integer(n); al.add(n);//不可以 al.add(nI);//可以
相关文章推荐
- java Integer.ValueOf(int)和new Integer(int)性能比较
- 【Java】 Integer 包装器的比较小陷阱(一种优化策略惹得祸)
- java基本对象Integer,String比较相等及equal案例说明
- Java Integer 比较
- JAVA中Long与Integer比较容易犯的错误
- Java 小例子:不通过逻辑运算和类库,比较两个 integer 大小
- Java中Integer与int类型的比较--装箱和拆箱
- java中Integer的比较的问题
- Java的String.valueOf 转换 与、空串+类型变量转换与封装类(Integer)的toString方式转换比较
- Java String 比较和 Integer 比较
- java Integer.ValueOf(int)和new Integer(int)性能比较
- Java自动装箱解箱问题&&int和Integer类型==比较问题
- java Integer和int之间==的比较问题。求解释
- java基础之Integer和Long对象相等比较 .
- java基础之Integer和Long对象相等比较
- java Integer比较的妙用
- Java包装类Integer比较
- java Integer 比较的问题
- java Integer 比较
- Java中Integer直接比较大小