繁体   English   中英

Android ArrayList无法预测的行为

[英]Android ArrayList unpredictable behavior

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个项目才能出错。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM