Размер списка массивов Java становится огромным при добавлении объектов

#java #arraylist #iterator #size

#java #arraylist #итератор #размер

Вопрос:

У меня проблема, когда я добавляю объекты Entity в свой ArrayList (здесь называемые entities). Каждый объект-объект имеет длинный идентификатор, int x-position и y-position

Сначала я проверяю, пуст ли список, при этом он должен быть в начале. Если я добавляю 2-й объект-объект, я проверяю, существует ли идентификатор объекта, и если да, то позиции объекта-объекта обновляются. Если объект не существует, его следует добавить.

Моя проблема в том, что размер ArrayList становится огромным, и я не уверен, как это исправить.

Весь следующий код находится в методе update(), который выполняется непрерывно.

  /**
  * Method that checks if the entity exist or not.
  * @param ent - The Entity that should be updated or added.
  */
 public void checkEntity(Entity ent){
   if(entities.isEmpty()){
     entities.add(ent);
   }
   else{
     for(ListIterator<Entity> li = entities.listIterator(); li.hasNext();){
       Entity next = li.next();
     if(next.getID() == ent.getID()){
//     System.out.println("id: "   next.getID()   " xPos: "   next.getXPos()   " yPos: "   next.getYPos()   " type: "   next.getType());
       next.setXPos(xPos);
       next.setYPos(yPos);

     }
     else{
       li.add(ent);
     }
     System.out.println(entities.size());
   }
 }
  

Комментарии:

1. Определите «огромный».

2. Около 20000 , когда он должен быть размером примерно 2.

3. Ваш цикл добавляет элемент всякий раз, когда он не совпадает с элементом из итератора. Вы хотите добавить элемент только в том случае, если ни один элемент не совпадает с элементом из итератора.

Ответ №1:

Проблема в том, что вы добавляете новую запись в список каждый раз, когда находите запись, которая не имеет того же идентификатора … ваш add вызов находится внутри вашего цикла, и этого не должно быть.

В принципе, у вас должно быть что-то вроде:

 public void checkEntity(Entity entity) {
    for (Entity candidate : entities) {
        if (candidate.getID() == entity.getID()) {
            candidate.setXPos(entity.getXPos());
            candidate.setYPos(entity.getYPos());
            // Found a matching entity, so we're done now.
            // This is important, so we don't add the entity again.
            return;
        }
    }
    // Haven't found it, so add it to the list
    entities.add(entity);
}
  

Обратите внимание, что это будет очень неэффективно, если вы добавите много объектов. Было бы намного эффективнее иметь сопоставление идентификатора объекта с объектом … тогда вам не нужно проверять каждый объект каждый раз.

Комментарии:

1. Ах, теперь я понимаю проблему. Большое спасибо за вашу помощь.