Java Integer比较中的那些坑

来源:互联网 发布:大数据导论 pdf 编辑:程序博客网 时间:2024/06/06 12:58

前几天同事偶然遇到的一个问题,在list中查询出重复的值,留下第一个,其余删除。

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类型呢?这是因为ArrayList中只接受Object对象,实际情况如下:

ArrayList al=new ArrayList();int n=40;Integer nI=new Integer(n);al.add(n);//不可以al.add(nI);//可以
0 0
原创粉丝点击