Android ArrayList непредсказуемое поведение - PullRequest
0 голосов
/ 07 октября 2011

У меня странная проблема с ArrayList на Android

Если я это сделаю

        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 ]

1 голос
/ 07 октября 2011

Похоже, типичная проблема автобокс. В своем первом решении вы написали «mRealRowId == mReadRowIds.get (kk)». Значение в ArrayList возвращается как Integer и сравнивается с int автоматически приводимым к Integer. Сравнивая значения с ==, вы выполняете сравнение идентичности. Хитрость в том, что в диапазоне от -128 до 127 существует кэш целочисленных значений, поэтому ваш код начинает ломаться около 200.

Простым решением было бы убедиться, что вы используете только целые числа, а не целые числа, как во втором решении.

1 голос
/ 07 октября 2011

Похоже, что когда вы вызываете метод ArrayList get(index), он возвращает универсальный объект.В первом примере вы сравниваете целое число с этим универсальным объектом, но во втором вы приводите универсальный объект к целому числу (по присваиванию), а затем сравниваете их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...