Android ArrayList无法预测的行为

时间:2011-10-06 20:38:36

标签: android arraylist

我在Android上的ArrayList遇到了一个奇怪的问题

如果我这样做

        for(int kk=0;kk<mReadRowIds.size();kk++)
        {
            if(mRealRowId==mReadRowIds.get(kk))
            {
                if(kk<mRowNumTimes.size())
                {
                    mArrayNumberPortions.add(mRowNumTimes.get(kk));
                    bFoundIt=true;
                    break;
                }
                else
                {
                    break;
                }
            }
        }

找不到该项目,但如果我这样做

        int readrowidforcmp;
        for(int kk=0;kk<mReadRowIds.size();kk++)
        {
            readrowidforcmp = mReadRowIds.get(kk);
            if(mRealRowId==readrowidforcmp)
            {
                if(kk<mRowNumTimes.size())
                {
                    mArrayNumberPortions.add(mRowNumTimes.get(kk));
                    bFoundIt=true;
                    break;
                }
                else
                {
                    break;
                }
            }
        }

该项目被发现,有人可以解释这些对我的区别是什么,因为我没有线索。注意:阵列必须超过200个项目才能出错。

2 个答案:

答案 0 :(得分:1)

看起来可能在调用ArrayList的get(index)方法时,它会返回一个通用对象。在第一个示例中,您将整数与该泛型对象进行比较,但在第二个示例中,您将通用对象转换为整数(通过赋值),然后比较它们。

答案 1 :(得分:1)

它看起来像一个典型的自动拳击问题。在您的第一个解决方案中,您编写了“mRealRowId == mReadRowIds.get(kk)”。 ArrayList中的值作为Integer返回,并与int自动转换为Integer进行比较。通过将值与==进行比较,您正在执行身份比较。诀窍是在-128和127之间存在一个Integer值的缓存,这就是为什么你的代码开始在200左右突破。

一个简单的解决方案是确保你只使用整数,而不是像你的第二个解决方案那样使用整数。